Java多线程——基础概念

Java多线程——基础概念

什么是进程和线程

在操作系统中,一个正在运行的程序称为进程(process),进程可以拥有多个相互独立执行流程,称为线程(thread)。一个进程中至少有一个主线程。

为什么需要使用多线程

多线程的主要目的是提高程序的效率,特别是在当程序需要同时执行多个耗时操作时,可以通过多线程将这些操作并发地执行,提高整个程序的执行效率。同时,多线程也能够使得程序具有更好的响应性,因为当一个线程被阻塞时,其他线程还可以继续执行,从而保持程序的运行。

如何实现多线程

Java中实现多线程主要有两种方式:继承Thread类和实现Runnable接口。

继承Thread类

继承Thread类是实现多线程的一种方式,具体步骤如下:

  1. 创建Thread子类,并重写run()方法
  2. 创建Thread子类的实例,并调用start()方法启动线程

示例代码如下:

public class MyThread extends Thread {
    public void run() {
        System.out.println("This is a new thread, started by extending Thread class.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        System.out.println("Main thread has finished.");
    }
}

运行结果:

This is a new thread, started by extending Thread class.
Main thread has finished.

实现Runnable接口

实现Runnable接口也是实现多线程的一种方式,具体步骤如下:

  1. 创建实现Runnable接口的类,该类包含一个run()方法
  2. 创建该类的实例
  3. 创建Thread类的实例,并将刚创建的Runnable实例作为参数传递给Thread的构造方法
  4. 调用start()方法启动线程

示例代码如下:

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("This is a new thread, started by implementing Runnable interface.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
        System.out.println("Main thread has finished.");
    }
}

运行结果:

This is a new thread, started by implementing Runnable interface.
Main thread has finished.

线程的生命周期

在Java中,每个线程都有自己的生命周期。生命周期包括五个状态:

  1. 新建状态(New):线程被创建但还没有启动
  2. 就绪状态(Runnable):线程可以开始执行,等待被调度器调度
  3. 运行状态(Running):线程正在执行任务
  4. 阻塞状态(Blocked):线程被阻塞,等待某些条件的解除,例如等待IO完成、等待锁或等待线程的状态修改等
  5. 终止状态(Terminated):线程执行完任务或出现异常而终止

同步与互斥

多线程中经常会出现对共享资源的竞争,因此需要使用同步和互斥机制来保证对共享资源的正确访问。

Synchronized同步

Synchronized是Java中用来实现同步的关键字,加上Synchronized关键字的代码块,在同一时间只有一个线程可以执行,其他线程需要等待。

示例代码:

public class MyThread extends Thread {
    private static int count = 0;
    public synchronized void run() {
        for (int i = 0; i < 5; i++) {
            count++;
            System.out.println("Thread " + getName() + " gets count = " + count);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

运行结果:

Thread Thread-0 gets count = 1
Thread Thread-0 gets count = 2
Thread Thread-0 gets count = 3
Thread Thread-0 gets count = 4
Thread Thread-0 gets count = 5
Thread Thread-1 gets count = 6
Thread Thread-1 gets count = 7
Thread Thread-1 gets count = 8
Thread Thread-1 gets count = 9
Thread Thread-1 gets count = 10

Lock互斥

Java中也可以使用Lock接口来实现互斥,Lock接口提供了与Synchronized关键字相同的功能,但它提供了更高级的同步功能。使用Lock需要自己手动加锁和解锁。

示例代码:

public class MyThread extends Thread {
    private static int count = 0;
    private Lock lock = new ReentrantLock();
    public void run() {
        lock.lock();
        try {
            for (int i = 0; i < 5; i++) {
                count++;
                System.out.println("Thread " + getName() + " gets count = " + count);
            }
        } finally {
            lock.unlock();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

运行结果:

Thread Thread-0 gets count = 1
Thread Thread-0 gets count = 2
Thread Thread-0 gets count = 3
Thread Thread-0 gets count = 4
Thread Thread-0 gets count = 5
Thread Thread-1 gets count = 6
Thread Thread-1 gets count = 7
Thread Thread-1 gets count = 8
Thread Thread-1 gets count = 9
Thread Thread-1 gets count = 10

总结

Java多线程是Java编程领域中比较重要的一块内容,通过本文的讲解,希望读者能够掌握Java多线程的基本概念和实现方式。在实现多线程时要注意同步和互斥,保证程序的正确性和效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程——基础概念 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解JavaScript中的函数、对象

    详解JavaScript中的函数 JavaScript中的函数是非常重要的一个概念,它不仅仅可以完成一些基本的计算和逻辑操作,还可以使用函数作为参数、返回值或者构造函数。以下是详细讲解函数的内容。 函数声明 在JavaScript中,函数的声明可以使用function关键字,其后跟随函数名、参数列表和函数体。 function add(a, b) { ret…

    Java 2023年5月26日
    00
  • Java实现考试系统

    Java实现考试系统攻略 概述 本文介绍如何使用Java实现一个考试系统。该系统包含了以下功能: 单选题和多选题的创建和管理 考试试卷生成和管理 学生考试、交卷和阅卷 系统设计 数据库设计 考试系统需要存储题目、试卷和学生等信息。因此需要设计以下表格: question 表:用于存储题目信息,包括题目内容、选项和正确答案等。 exam 表:用于存储试卷信息,…

    Java 2023年5月19日
    00
  • MySQL实现JDBC详细步骤

    下面我们详细讲解一下“MySQL实现JDBC详细步骤”的完整攻略。 什么是JDBC? JDBC是Java语言中访问关系型数据库的应用程序接口,作为Oracle公司为开发者提供的数据库访问技术之一,主要用于在Java应用程序中进行数据库操作,同时也可以与其他编程语言进行协作。 MySQL实现JDBC详细步骤 下面将为大家详细介绍如何使用MySQL实现JDBC。…

    Java 2023年5月19日
    00
  • 解决IDEA springboot”spring-boot-maven-plugin”报红问题

    首先,这个报红问题通常是由于IntelliJ IDEA的缓存导致的,因此我们可以尝试清除缓存解决这个问题。 步骤如下: 在IntelliJ IDEA中打开你的项目,进入Maven Projects的面板。 找到被报红的项目,展开该项目的”Plugins”节点。 找到“spring-boot-maven-plugin”这个插件,右键选择“clean”,然后再右…

    Java 2023年5月19日
    00
  • 什么是Java缓存技术?

    Java缓存技术是指将计算机处理的结果或持久化数据存储在计算机内存中,以便更快地访问这些数据。Java缓存技术主要用于改善性能,减少应用程序请求数据的间隔时间。在Java中,常用的缓存技术包括内存缓存、文件缓存和Redis缓存等。 内存缓存 内存缓存是一种基于Java集合框架的缓存技术,它将数据存储在应用程序的内存中。内存缓存能够提供快速响应时间,但受到内存…

    Java 2023年5月11日
    00
  • php正则去除网页中所有的html,js,css,注释的实现方法

    下面是PHP正则去除网页中所有的HTML、JS、CSS、注释的实现方法的完整攻略: 1. 去除HTML标签 使用PHP的正则表达式函数preg_replace,结合HTML标签的正则表达式,可以方便地去除网页中的所有HTML标签。以下是示例代码: // 去除HTML标签 $pattern = ‘/<[^>]+>/’; $replacemen…

    Java 2023年6月15日
    00
  • 终于把 Spring Boot 3.0 写成书了!

    大家好,我是R哥。 我的新书《Spring Boot 3 核心技术与最佳实战》打磨一年多,今天终于上市了,定价 158 元,今天刚上市搞 5 折促销,80 元不到上车,这可能是全网最便宜的时候了,机会难得,想拥抱 Spring Boot 3.0 的不要错过。 文章还没发,已经有老铁粉丝上车了,真爱啊。。。 为什么要学 Spring Boot? Spring …

    Java 2023年4月19日
    00
  • Python和Go成为2019年最受欢迎的黑客工具(推荐)

    Python和Go成为2019年最受欢迎的黑客工具(推荐) 最近,Python和Go成为了黑客最钟爱的工具之一,这主要是因为Python和Go都具有强大的库和框架,而且易于学习和使用。在本篇攻略中,我们将介绍使用Python和Go进行黑客工作的基本步骤和示例。 Python攻击黑客工具示例 1. UDP Flooding攻击 UDP Flooding是一种D…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部