线程的状态
Thread.state: NEW,RUNNABLE,BLOCKED,WAITING,TIME_WAITING,TERMINATED
new Thread() implements Runnable implements Callable
本质上都是通过 Thread 来运行
Callable 通过 FutureTask task.get()
LockSupport.park(this) 等待TIME_WAITING来获取返回值.
FutureTask task =new FutureTask(callableTest);
Thread t1= new Thread(task); t1.start();
中断线程
interrupt 设置中断线程 如果线程在运行状态会把线程状态设置为中断状态 如果线程在阻塞、等待状态 会进入 InterruptedException 异常 中断状态为false; Thread.currentThread().isInterrupted() 获取线程的中断状态 Thread.interrupted() 会把线程的中断状态重置返回.
Thread.stop()
不安全,会立马释放掉所持有的锁,会导致所保护的资源不一致.
sleep 与 wait 的区别
sleep 不释放锁 wait 释放锁
wait 必须搭配synchronized 关键字使用(如果不搭配会Lost Wake-Up Problem,唤醒丢失的问题) sleep 不需要
进入wait状态下的线程能被 notify(随机唤醒一个) notifyAll唤醒 sleep不行
怎么证明sleep 不释放锁,wait释放锁
public static void main(String[] args) throws InterruptedException {
Object obj= new Object();
new Thread(()->{
synchronized (obj){
System.out.println(" obj wait");
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" obj wait end");
}
}
).start();
Thread.sleep(200);
synchronized (obj){
System.out.println(" obj notify");
obj.notify();
System.out.println(" obj notify end");
}
Object obj2 = new Object();
new Thread( ()->{
synchronized (obj2){
System.out.println(" obj2 sleep start");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("obj2 sleep end");
}
}).start();
Thread.sleep(200);
synchronized (obj2){
System.out.println(" obj2 notify");
obj2.notify();
System.out.println(" obj2 notify end");
}
}
obj wait
obj notify
obj notify end
obj wait end
obj2 sleep start
obj2 sleep end
obj2 notify
obj2 notify end