一、线程挂起与恢复
1、在久的JDK版本中,提供了下面两个方法,但目前已经废弃了,Thread源码中都加了@Deprecated注解
thread.suspend() 该方法不会释放线程所占用的资源。如果使用该方法将某个线程挂起,则可能会使其他等待资源的线程死锁
thread.resume() 方法本身并无问题,但是不能独立于suspend()方法存在
2、可以使用的方法:
wait() 暂停执行、放弃已经获得的锁、进入等待状态
notify() 随机唤醒一个在等待锁的线程
notifyAll() 唤醒所有在等待锁的线程,自行抢占cpu资源
##在下面的测试代码中,大家要注意必须是同一个锁,且锁的对象必须一致,不然会报错
public class WaitDemo implements Runnable {
private static Object waitObj = new Object();
@Override
public void run() {
//持有资源
synchronized (waitObj) {
System.out.println(Thread.currentThread().getName()+"占用资源");
try {
waitObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"释放资源");
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new WaitDemo(),"对比线程");
thread.start();
Thread thread2 = new Thread(new WaitDemo(),"对比线程2");
thread2.start();
Thread.sleep(3000L);
synchronized (waitObj) {
waitObj.notify();
}
}
}
结果如右,随机唤醒了一个线程
二、线程中断
1)stop() ,是废弃方法,开发中不要使用。因为一调用,线程就立刻停止,此时有可能引发相应的线程安全性问题
2)调用Thread.interrupt方法
3)自行定义一个标志,用来判断是否继续执行