大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。
“行百里者半九十”原义是走一百里的路程走到九十里只能算走了一半;比喻做事越接近成功越困难,越要认真对待。常用以勉励人做事情要坚持到底不松劲。
线程与多线程
1.线程
在操作系统中,线程是比进程更小的能够独立运行的基本单位。同时,它也是CPU调度的基本单位。线程本身基本上不拥有系统资源,只是拥有一些在运行时需要用到的系统资源,例如程序计数器,寄存器和栈等。一个进程中的所有线程可以共享进程中的所有资源。
2.多线程
多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行。
多线程编程能够最大限度的利用CPU的资源。如果某一个线程的处理不需要占用CPU资源时(例如IO线程),可以使当前线程让出CPU资源来让其他线程能够获取到CPU资源,进而能够执行其他线程对应的任务,达到最大化利用CPU资源的目的。
线程的实现方式
在Java中,实现线程的方式大体上分为三种,通过继承Thread类、实现Runnable接口,实现Callable接口。简单的示例代码分别如下所示。
1.继承Thread类代码
package com.yang.createThread;
/**
* @ClassName: CreateThread1
* @Description:继承Thread实现线程
* @Author yab
* @Date 2021/11/20 16:32
* @Version 1.0
*/
public class CreateThread1 extends Thread {
@Override
public void run() {
//TODO 在此写在线程中执行的业务逻辑
}
}
2.实现Runnable接口的代码
package com.yang.createThread;
/**
* @ClassName: CreateThread2
* @Description:实现Runnable实现线程
* @Author yab
* @Date 2021/11/20 16:34
* @Version 1.0
*/
public class CreateThread2 implements Runnable{
@Override
public void run() {
//TODO 在此写在线程中执行的业务逻辑
}
}
3.实现Callable接口的代码
package com.yang.createThread;
import java.util.concurrent.Callable;
/**
* @ClassName: CreateThread3
* @Description:实现Callable实现线程
* @Author yab
* @Date 2021/11/20 16:34
* @Version 1.0
*/
public class CreateThread3 implements Callable<String> {
@Override
public String call() throws Exception {
//TODO 在此写在线程中执行的业务逻辑
return null;
}
}
线程的生命周期
1.生命周期
一个线程从创建,到最终的消亡,需要经历多种不同的状态,而这些不同的线程状态,由始至终也构成了线程生命周期的不同阶段。线程的生命周期可以总结为下图。
其中,几个重要的状态如下所示。
NEW:初始状态,线程被构建,但是还没有调用start()方法。
RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。
BLOCKED:阻塞状态,处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized。
WAITING:表示等待状态,处于该状态的线程需要等待其他线程对其进行通知或中断等操作,进而进入下一个状态。
TIME_WAITING:超时等待状态。可以在一定的时间自行返回。
TERMINATED:终止状态,当前线程执行完毕。