浅谈Java多线程基础及其使用方式

2 阅读4分钟

前言

本讲主要介绍多线程,多线程编程是Java编程中的一个重要部分。它允许程序同时执行多个任务,这有助于提高程序的效率和性能。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。

Java多线程是指在一个进程中有多个线程在并发执行。在Java中,每个线程都有其自己的程序计数器、堆栈和局部变量等资源,这些资源是线程私有的。多个线程可以同时执行,可以提高程序的并发性和效率。如图:

请在此添加图片描述

一、Java中的线程状态

线程在Java中有多种状态,包括:

1.新建(New):当我们创建一个新的Thread对象时,它处于新建状态。

2.就绪(Runnable):一旦线程被启动并且所有本地资源都已经被成功分配,它就可以运行了。此时,线程处于就绪状态。

3.阻塞(Blocked):当线程由于某种原因(如等待I/O操作)无法运行时,它处于阻塞状态。

4.等待(Waiting):当线程处于等待状态时,它会一直等待,直到另一个线程做出某种动作(如调用notify或notifyAll方法)。

5.超时等待(Timed Waiting):这是一种带有时间限制的等待。当线程等待了指定的时间后,就会自动结束等待状态。

6.终止(Terminated):当线程执行完毕或被强制终止时,它处于终止状态。

上面也是多线程的生命周期,6种状态是可以切换的。如图:

请在此添加图片描述

线程的状态切换是由操作系统控制的。当线程处于就绪状态时,它会被操作系统调度并分配CPU资源。在执行过程中,线程可能会因为某些原因而进入阻塞状态,例如等待I/O操作。当阻塞状态被解除时,线程会重新进入就绪状态,等待CPU资源的分配。如果所有线程都处于就绪状态,操作系统会根据优先级和时间片等因素来决定哪个线程先获得CPU资源。在Java中,可以使用Thread.getState()方法来获取线程的状态信息。例如:thread.getState()返回Thread.STATE_NEW表示线程处于新建状态,Thread.STATE_RUNNABLE表示线程处于就绪状态。

二、创建线程的两种方式

Java中的多线程可以通过以下两种方式实现

1.实现Runnable接口

要实现Runnable接口,需要重写run()方法。run()方法包含了线程的执行代码。创建Thread对象时,需要将实现了Runnable接口的对象作为参数传递给Thread构造函数。当线程被启动时,run()方法会被调用。

代码如下:

public class MyRunnable implements Runnable {  
    @Override  
    public void run() {  
        System.out.println("Thread is running...");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        Thread thread = new Thread(new MyRunnable());  
        thread.start();  
    }  
}

2.继承Thread类

public class MyThread extends Thread {  
    @Override  
    public void run() {  
        System.out.println("Thread is running...");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        MyThread thread = new MyThread();  
        thread.start();  
    }  
}

三、多线程用途和总结

Java多线程的用途主要体现在以下几个方面:

  1. 提高系统的响应性能:多线程可以将耗时的操作放在后台线程中处理,使得主线程能够及时响应用户的操作,提高界面的流畅度和响应速度。这在图形界面应用程序、Web服务等领域尤其有效。
  2. 提高计算机资源的利用率:多线程可以同时利用多核处理器的优势,将任务分配到不同的线程上并行执行,提高计算机资源的利用率。这尤其适用于数据密集型计算任务。
  3. 实现任务的并行处理:对于可以并行执行的任务,多线程可以将任务分解为多个子任务,并通过多个线程同时执行,从而加快任务的完成速度。
  4. 异步编程:多线程可以实现异步编程模型,通过在后台线程执行耗时的操作,让主线程继续执行其他任务,提升用户体验。
  5. 实现复杂的任务调度和协同:多线程可以用于实现复杂的任务调度和协同。不同的线程可以根据优先级或条件进行调度,完成不同的任务,实现复杂的业务逻辑。

总之,Java多线程技术在提高系统性能、优化资源利用、加速任务处理、提升用户体验等方面发挥着重要作用。