线程之suspend和resume方法

来源:互联网 发布:餐厅排队叫号软件 编辑:程序博客网 时间:2024/05/16 08:44

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方法时一定要格外注意,避免上述现象出现。