当前位置:   article > 正文

java多线程被废除的暂停和恢复_多线程 suspend resume

多线程 suspend resume

1.暂停线程

暂停线程意味着此线程还可以恢复运行,在java多线程中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程线程运行,但suspend和resume方法都是废除的方法,如果使用不注意,会有一些占用和不同步的问题。

例子:

线程:

  1. package stopMethod;
  2. public class Thread5 extends Thread{
  3. private long i=0;
  4. public long getI() {
  5. return i;
  6. }
  7. public void setI(long i) {
  8. this.i = i;
  9. }
  10. public void run(){
  11. while(true){
  12. i++;
  13. }
  14. }
  15. }

运行方法:

  1. package stopMethod;
  2. public class Run5 {
  3. public static void main(String[] args) {
  4. try {
  5. Thread5 t5=new Thread5();
  6. t5.start();
  7. Thread.sleep(5000);
  8. t5.suspend();
  9. //A组
  10. System.out.println("A= "+System.currentTimeMillis()+" i= "+t5.getI());
  11. Thread.sleep(5000);
  12. System.out.println("A= "+System.currentTimeMillis()+" i= "+t5.getI());
  13. //B组
  14. t5.resume();
  15. Thread.sleep(5000);
  16. //C组
  17. System.out.println("B= "+System.currentTimeMillis()+" i= "+t5.getI());
  18. Thread.sleep(5000);
  19. System.out.println("B= "+System.currentTimeMillis()+" i= "+t5.getI());
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

结果:

  1. A= 1474074033705 i= 2500945734
  2. A= 1474074038706 i= 2500945734
  3. B= 1474074043706 i= 4999788165
  4. B= 1474074048706 i= 7513356222

从输出结果可以看出线程可以暂停并可以恢复运行。

2.suspend与resume的缺点---独占

如果suspend使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。

例子:

锁类:

  1. package suspend_resume;
  2. public class SynchronizedObject {
  3. synchronized public void printString(){
  4. System.out.println("begin");
  5. if(Thread.currentThread().getName().equals("a")){
  6. System.out.println("a 线程永远suspend了");
  7. Thread.currentThread().suspend();
  8. }
  9. System.out.println("end");
  10. }
  11. }

main方法

 

  1. package suspend_resume;
  2. public class Run {
  3. public static void main(String[] args) {
  4. try {
  5. final SynchronizedObject obj=new SynchronizedObject();
  6. Thread thread1=new Thread(){
  7. public void run(){
  8. obj.printString();
  9. }
  10. };
  11. thread1.setName("a");
  12. thread1.start();
  13. Thread.sleep(1000);
  14. Thread thread2=new Thread(){
  15. public void run(){
  16. System.out.println("Thread2 启动了,但无法范文printStrin方法");
  17. obj.printString();
  18. }
  19. };
  20. thread2.start();
  21. } catch (InterruptedException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }
  26. }

结果:

 

  1. begin
  2. a 线程永远suspend了
  3. Thread2 启动了,但无法范文printStrin方法


另外还有一种情况也会掉进坑里面去

线程:

  1. package suspend_resume;
  2. public class Thread1 extends Thread {
  3. private long i=0;
  4. public void run(){
  5. while(true){
  6. i++;
  7. System.out.println(i);
  8. }
  9. }
  10. }

Run方法

  1. package suspend_resume;
  2. public class Run1 {
  3. public static void main(String[] args) {
  4. try {
  5. Thread1 t1=new Thread1();
  6. t1.start();
  7. Thread.sleep(1000);
  8. t1.suspend();
  9. System.out.println("main end");
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }

结果:

 

  1. 127559
  2. 127560
  3. 127561
  4. 127562
  5. 127563


结果没有输出main end,是因为println源码也有锁,由于suspend一直占用,锁不能被释放

  1. public void println(String x) {
  2. synchronized (this) {
  3. print(x);
  4. newLine();
  5. }
  6. }


3.suspend与resume的缺点---不同步

在使用suspend方法时也容易出现因为线程的暂停而导致数据不同步的情况。

例子:

测试类:

  1. package suspend_resume;
  2. public class MyObject {
  3. private String usename="11";
  4. private String pwd="22";
  5. public void setValue(String u,String p){
  6. this.usename=u;
  7. if("a".equals(u)){
  8. System.out.println("a线程被暂停!");
  9. Thread.currentThread().suspend();
  10. }
  11. }
  12. public void printMessage(){
  13. System.err.println(usename+" "+pwd);
  14. }
  15. }

Run方法:

  1. package suspend_resume;
  2. public class SuspendTest {
  3. public static void main(String[] args) throws InterruptedException {
  4. final MyObject obj=new MyObject();
  5. Thread t1=new Thread(){
  6. public void run(){
  7. obj.setValue("bb","bbb");
  8. }
  9. };
  10. t1.start();
  11. Thread.sleep(1000);
  12. Thread t2=new Thread(){
  13. public void run(){
  14. obj.printMessage();
  15. }
  16. };
  17. t2.start();
  18. }
  19. }

结果:

 

bb 22
可以看出程序出现值不同步的问题,所以在程序中使用suspend方法一定要注意。






 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号