suspend() 和 resume() 两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态。
suspend() 和 resume() 方法有很多缺点。下面将其缺点列举一二
1.当 suspend() 和 resume() 方法使用不当时极容易造成公共同步对象的独占,使其他线程无法访问公共对象资源。
写一个简单的列子直观说明该问题,如下:
package com.java;
class PrintObject{
synchronized public void printString(){
System.out.println("begin");
if(Thread.currentThread().getName().equals("a")){
System.out.println("线程 a 被中断");
Thread.currentThread().suspend();
}
if(Thread.currentThread().getName().equals("b")){
System.out.println("线程 b 运行");
}
System.out.println("end");
}
}
public class java_test{
public static void main (String[] args){
try{
PrintObject pb = new PrintObject();
Thread thread1 = new Thread(){
@Override
public void run(){
pb.printString();
}
};
thread1.setName("a");
thread1.start();
thread1.sleep(1000);
Thread thread2 = new Thread(){
@Override
public void run(){
pb.printString();
}
};
thread2.setName("b");
thread2.start();
}catch(InterruptedException e){
}
}
}
从上面的运行结果可以看到线程a 在printString函数中暂停了自己,而函数printString 又使用了同步锁(synchronized)
导致线程b无法执行函数printString。
2.当 suspend() 和 resume() 方法使用不当时也容易造成数据不同步的情况。我仍然来看一个列子:
package java_thread;
class MyObject{
private String passWord = "a";
private String userName = "b";
public void setValue(String p, String u){
this.passWord = p;
if(Thread.currentThread().getName().equals("a")){
System.out.println("线程 a 被中断");
Thread.currentThread().suspend();
}
this.userName = u;
}
public void printObject(){
System.out.println("passWord :" + passWord);
System.out.println("userName :" + userName);
}
}
public class Thread_test {
public static void main (String[] args){
try{
MyObject ob = new MyObject();
Thread thread1 = new Thread(){
@Override
public void run(){
System.out.println("线程a 开始运行");
ob.setValue("11","22");
}
};
thread1.setName("a");
thread1.start();
thread1.sleep(1000);
Thread thread2 = new Thread(){
@Override
public void run(){
System.out.println("线程b 开始运行");
ob.printObject();
}
};
thread2.setName("b");
thread2.start();
}catch(InterruptedException e){
}
}
}
从上面的运行结果可以看出线程a在修改了passWord的值后自己暂停了,这时线程b去读取passWord 和userName时就会出现数据不同步的现象。
综上所诉,在使用suspend和resume方法时一定要格外注意,避免上述现象出现。