一、线程状态
1、新建(new):创建了线程,还没有调用start()方法。
2、就绪(Runnable):调用了start方法后,线程处于可运行状态,线程可能不会立即执行,需要等待CPU的调度。
3、锁阻塞(Blocked):没有获取到锁对象时,等待另一个获取到锁的线程释放锁
4、无限等待(Waiting):执行wait()方法后,线程处于无线等待,此时线程必须靠其他线程调用notify()或者notifyAll方法将其唤醒
5、计时等待(Time_Waiting):执行sleep(time)或者wait(time)方法后,线程处于计时等待,要么得到线程后自醒,要么时间未到被其他线程执行notify唤醒
6、死亡(Terminated):执行完run方法,或者发生了异常没有处理时线程强制退出
二、补充问题
(1)线程获得锁后处于什么状态?
处于就绪态。
(2)线程处于无线状态被唤醒后,可能处于什么状态?
没有获得锁对象时,进入到阻塞状态,获得到锁后,可进入运行状态
(3)sleep和wait得区别:
sleep如果线程获得锁后,执行sleep不会释放锁,wait会释放锁
(4)notify()和notifyAll()的区别:
如果有多个线程处于无限等待状态时,notify会随机唤醒一个线程,notifyAll会将所有等待的线程唤醒,被唤醒过后的线程, 可能处于可运行状态或锁阻塞状态。
ps:notify()和notifyAll()不会释放锁
三、线程之间得通信
四、线程池:降低开销
当我们使用Thread来创建和开启线程,如果创建的线程数量过多,频繁的创建和销毁线程会消耗大量的资源,所以使用线程池来创建线程可以极大的降低线程在创建和消耗时所使用的资源。
模拟创建线程池:
public class MyThreadPool {
public static void main(String[] args) {
MyThreadPool p = new MyThreadPool(5);
System.out.println(p.list);
Thread t=p.getThread();
System.out.println(p.list);
p.returnThread(t);
System.out.println(p.list);
}
//1.声明一个LinkedList存储Thread对象
private LinkedList<Thread> list;
//2.构造函数初始化
public MyThreadPool(int num){
this.list=new LinkedList<>();
/3./存储Thread对象
for (int i = 1; i <=num ; i++) {
list.add(new Thread("线程"+i));
}
}
/4./取出对象
public Thread getThread(){
return list.get(0);
}
//5.归还
public void returnThread( Thread t){
list.add(t);
}
}