线程之suspend和resume方法

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){
      }
  }
}

线程之suspend和resume方法_第1张图片

从上面的运行结果可以看到线程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){
          }
      }
}

线程之suspend和resume方法_第2张图片

从上面的运行结果可以看出线程a在修改了passWord的值后自己暂停了,这时线程b去读取passWord 和userName时就会出现数据不同步的现象。

综上所诉,在使用suspend和resume方法时一定要格外注意,避免上述现象出现。

你可能感兴趣的:(多线程)