Java多线程(一)—— 多线程基础

进程与线程

进程

进程是程序(任务)的执行过程,是动态性的。

持有资源(共享内存、共享文件)和线程。进程是资源和线程的载体。

线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

同一进程之中可以有多个线程。

线程共享进程的资源。

进程与线程的区别和联系

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。

线程的交互

互斥与同步

Java对线程的支持与实现

线程的实现

Java对线程的支持主要体现在Thread类和Runnable接口上,它们都继承于java.lang包。它们有个共同的方法run()方法,这个方法提供了线程实际工作和执行的代码。 

java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。

Thread方法

Thread类和Runnable接口比较

创建线程的两种方式

  • Runnable方式可以避免Thread方式由于Java单继承特性带来的缺陷(在Java中一个子类可以实现多个接口,但是只能继承一个父类)
  • Runnable的代码可以被多个线程(Thread实例)共享,适合于多个线程处理同一个资源的情况。
线程的生命周期

线程的生命周期

创建:新建一个线程对象,如 Thread thread = new Thread();

就绪状态:创建了线程对象后,调用了线程的start()方法。(注:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了)

运行状态:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()方法里面的逻辑。

终止:线程的run()方法执行完毕,或者线程调用了stop()方法,线程便进入中止状态。(注:目前stop()方法已经被摒弃了)

阻塞状态:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,则进入了阻塞状态,如调用了sleep()方法。

用户线程和守护线程

用户线程:

  • 运行在前台,执行具体任务
  • 程序的主线程、连接网络的子线程等都是用户线程

守护线程:

  • 运行在后台,为其他前台线程服务
  • 特点:一旦所有用户线程都结束,守护线程会随JVM一起结束工作
  • 应用:数据库连接池中的监测线程、JVM虚拟机启动后的监测线程
  • 最常见的守护线程:垃圾回收线程
  • 如何设置守护线程:可以通过调用Thread类的setDaemon(true)方法来设置当前的线程为守护线程。
  • 注意事项:
  • 1、setDaemon(true)必须在start()方法之前调用,否则会抛出IllegalThreadStateException 异常。2、在守护线程中产生的新线程也为守护线程。3、不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑(因为守护线程会在所有用户线程结束后也结束工作)
您的支持将鼓励我继续创作~