Java-线程-3
线程的状态
线程池
线程的状态
状态
状态 | 意义 |
---|---|
new | 新建状态 |
Runnable | 运行状态 |
Blocked | 阻塞状态 |
Terminated | 死亡状态 |
Timed_waiting | 休眠状态 |
Waiting | 无线等待状态 |
线程图
wait/notify
Object的两个方法:
进入到TimeWating(计时等待)有两种方式:
- 使用
sleep(long m)
方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked
状态 - 使用
wait(long m )
方法,wait
方法如果在毫秒值结束之后,还没被notify
唤醒,就会自动醒来唤醒的方法也有两个:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32public class demo {
public static void main(String[] args) {
//创建一个锁对象
Object obj = new Object();
//创建一个顾客线程
new Thread() {
public void run() {
//保证只有一个执行
synchronized (obj) {
System.out.println("顾客:我要一个包子");
try {
obj.wait(5000);
//Thread.sleep(5000);同样可以
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老板:包子做好了");
System.out.println("顾客:吃包子");
}
}
}.start();
new Thread() {
public void run() {
System.out.println("老板:做包子5s");
synchronized (obj) {
}
}
}.start();
}
} notify()
方法:随机唤醒一个notifyAll()
方法:唤醒所有的等待
注意事项:
wait
方法与notify
方法必须同一个锁对象调用!!wait
和notify
方法是属于Object
类的方法的wait
和notify
必须要在同步代码块或者是同步函数中使用
线程池
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但就会有一个问题:
如果并发的线程数很多,并且每一个线程都是执行一个时间很短的任务就结束了,
这样频繁的创建线程就会大大降低系统的效率,因为频繁的创建和销毁线程需要时间
线程池就可以用来执行完一个任务而不被立刻销毁,而是可以继续完成其他任务
线程池:
容纳多个线程的容器——集合:
JDK1.5之后,JDK内置了线程池,我们可以直接使用
好处:
- 减少了资源消耗,减少了线程创建和销毁的次数
- 提高响应速度:任务不需要等待线程创建即可执行
- 提高可管理性:根据系统的承受能力,调整线程池中工作线程的数目(每个线程大约要用1MB的内存)
Executors
包路径
1 | java.util |
构造
1 | public static ExecutorService newFixedThreadPool(int nThreads) |
ExecutorService
线程池的接口,用来从线程池中获取线程,调用start方法执行线程任务
ExecutorService常用方法
1 | Future<?> submit(Runnable task) |
步骤
步骤:
- 使用工厂类Executors的静态方法newFixedThread生产一个指定线程数量的线程池
- 创建一个类,实现Runnable接口,重写run方法,设置线程任务
- 调用ExecutorService方法submit,传递线程任务(实现类),开启线程,执行run方法
- 调用ExecutorService方法shutdown销毁线程池(不建议执行)
1 | import java.util.concurrent.ExecutorService; |
1 | //2.创建一个类,实现Runnable接口,重写run方法,设置线程任务 |