suspend 暂停线程 ,只是不继续执行任务, 线程对象还存在,可以调用 resume 恢复线程继续运行。
package a;
class Test extends Thread{
public int i=0;
@Override
public void run() {
super.run();
while (true){
i++;
}
}
}
public class Sender extends Thread {
public static void main(String[] args) throws InterruptedException {
Test a= new Test();
a.start();
System.out.println("初始值:"+a.i);
Thread.sleep(100);
a.suspend();
System.out.println("暂停休息之前值:"+a.i);
Thread.sleep(5000);
System.out.println("暂停后休息5s后的值:"+a.i);
a.resume();
Thread.sleep(100);
System.out.println("恢复了继续运行100ms后的值:"+a.i);
a.suspend();
System.out.println("第二次暂停值:"+a.i);
Thread.sleep(100);
System.out.println("暂停了100ms后的值:"+a.i);
System.out.println("end");
}
}
打印结果:
初始值:0
暂停休息之前值:55865221
暂停后休息5s后的值:55865221
恢复了继续运行100ms后的值:119669200
第二次暂停值:120014733
暂停了100ms后的值:120014733
end
我们可以看到这个两个方法都显示了删除线,suspend 和 resume 之所以废弃的原因是
- 独占锁不释放
- 获取值会错误 参考如下例子
package a;
class Test {
public String userName;
public String passWord;
public void setValue(String userName,String passWord) {
this.userName=userName;
if (Thread.currentThread().getName().equals("A")){
Thread.currentThread().suspend();
System.out.println("暂停了A线程");
}
this.passWord=passWord;
}
}
class RunA extends Thread{
Test a;
public RunA(Test a){
this.a=a;
}
@Override
public void run() {
super.run();
a.setValue("a","aa");
}
}
class RunB extends Thread{
Test a;
public RunB(Test a){
this.a=a;
}
@Override
public void run() {
super.run();
System.out.println("userName: "+a.userName);
System.out.println("passWord: "+a.passWord);
}
}
public class Sender extends Thread {
public static void main(String[] args) throws InterruptedException {
Test a= new Test();
RunA A=new RunA(a);
RunB B=new RunB(a);
A.start();
A.setName("A");
Thread.sleep(100);
B.start();
System.out.println("end");
}
}
打印结果如下:
end
userName: a
passWord: null