1. 进程(Process)和线程(Thread)
- 进程是资源分配的最小单位,线程是CPU调度的最小单位
- 一个进程可以包含多个线程
- 进程要比线程消耗更多的计算机资源
- 程序至少有一个进程,进程至少有一个线程
- 多个线程实际上是交替占用CPU资源,而非我们表面看起来的并行执行
2. 并行和并发
- 并行:多个CPU实例或是多台机器同时执行一段处理逻辑,是真正的同时
- 并发:通过CUP调度算法,让用户看上去同时去执行,实际上从CPU操作层面并不是真正的同时
3. Java 多线程实现
常见的Java多线程实现方式分为两种:
- 1.继承 Thread 类
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
class Test {
public static void main(String[] args) {
MyThread mythread1 = new MyThread();
MyThread mythread2 = new MyThread();
mythread1.start();
mythread2.start();
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
包含了1个主线程,2个子线程,output
Thread-0: 0
Thread-1: 0
main: 0
Thread-1: 1
Thread-0: 1
Thread-1: 2
main: 1
main: 2
Thread-0: 2
- 2.实现 Runnable 接口
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
class Test {
public static void main(String[] args) {
Thread mythread1 = new Thread(new MyThread());
Thread mythread2 = new Thread(new MyThread());
mythread1.start();
mythread2.start();
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
包含了1个主线程,2个子线程,output
main: 0
main: 1
Thread-0: 0
Thread-1: 0
Thread-0: 1
main: 2
Thread-0: 2
Thread-1: 1
Thread-1: 2
实现 Runnable 接口比继承 Thread 类更加具有优势
可以看出来一个线程还没有执行完,就被另一个线程抢了过去,说明这其中三个线程产生了竞争
线程的状态
- 创建(new)
- 就绪(Runnable),调用该线程的 start() 方法就可以启动线程。当线程启动时,线程进入就绪状态,该线程将进入线程队列排队,等待 CPU 服务
- 运行(Running),当就绪状态被调用并获得处理器资源时,线程就进入了运行状态,并自动调用该线程对象的 run() 方法,run() 方法定义该线程的操作和功能
- 阻塞(Blocked),一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作,会让 CPU 暂时中止自己的执行,进入阻塞状态
- 死亡(Dead),线程调用 stop() 方法时或 run() 方法执行结束后,即处于死亡状态
Reference
https://www.cnblogs.com/SUN99bk/p/10574512.html
https://blog.csdn.net/wanliguodu/article/details/81005560
https://www.cnblogs.com/java1024/archive/2019/11/28/11950129.html
https://zhuanlan.zhihu.com/p/26441926
https://zhuanlan.zhihu.com/p/32729534