并发的发展历史:
真空管/穿孔打点 计算机处理中会出现空闲状态。
晶体管/批处理操作系统
IO问题,造成CPU 资源浪费.
集成电路/多道程序设计
进程A(阻塞)/切换成进程B cpu 进程切换时间较短 ,对用户来说 看上去是同步进行的
基于CPU时间片切换的原理图:
线程(轻量级的进程)切换的效率高、成本低
计算机 由 单核–>多核 真正意义上达到并行计算
比如 写文件时,编写 跟 保存是并行执行的,
Java 中是如何应用线程的?
-
Runnable 接口
-
Thread类(本质上是对Runable 接口的实现) 父类调用子类的run();
public void run() { if (target != null) { target.run(); //调用目标线程的run(); } }
-
Callable /Future 带返回值的线程
-
线程池 ThreadPool
线程可以合理的利用多核心CPU资源,提高程序吞吐量.
实际应用
线程池
并发基础
生命周期: 6种状态、
NEW, //创建
RUNNABLE, //运行
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED; //终止
生命周期图解:
线程阻塞(blocked)几种状态的模拟
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
try {
while (true) {
TimeUnit.SECONDS.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "Time_Waiting_Thread").start();
new Thread(() -> {
while (true) {
synchronized (ThreadTest.class) {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "Wait_Tread").start();
new Thread(new BlockedDemo(),"blocked01").start();
new Thread(new BlockedDemo(),"blocked02").start();
}
static class BlockedDemo extends Thread {
@Override
public void run() {
synchronized (BlockedDemo.class) {
while (true) {
try {
TimeUnit.SECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
问题:
-
为什么启动一个线程是通过starat()?
java 源码Thread 类中 start() 是native 的 那么通过hostpot源码看看它是如何调用的
地址:http://hg.openjdk.java.net/jdk8u/jdk8u60/jdk/file/935758609767/src/share/native/java/lang/Thread.c
start0 定义如下:
可以在hostpots 类中Thread.cpp 文件找到底层调用如下:
启用后会回调run ();
-
怎么去终止一个线程?
为什么不是stop()?
1)Thread.interrupt();底层调用如下:
-
线程复位的两种方式
1)Thread.interrupted();
- InterruptedException 异常;