你的位置:首页 > 软件开发 > Java > 1.8暂停线程

1.8暂停线程

发布时间:2017-12-04 21:00:09
在java中,使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。1.8.1suspend与resume的使用:线程代码:public class Thread1 extends Thread { private long i = 0L; public l ...

1.8暂停线程

在java中,使用suspend()方法暂停线程,使用resume()方法恢复线程的执行。

1.8.1suspend与resume的使用:

线程代码:

public class Thread1 extends Thread { private long i = 0L; public long getI() {  return i; } public void setI(long i) {  this.i = i; } @Override public void run() {  while (true) {   i++;  } }}

执行代码:

public class Main { public static void main(String[] args) {  try {   Thread1 thread = new Thread1();   thread.start();   Thread.sleep(1000);   //A段   thread.suspend();   System.out.println("A = " + System.currentTimeMillis() + " I = " +thread.getI());   //B段   thread.resume();   Thread.sleep(1000);   //C段   thread.suspend();   System.out.println("B = " + System.currentTimeMillis() + " I = " + thread.getI());   Thread.sleep(5000);   System.out.println("B = " + System.currentTimeMillis() + "I = " + thread.getI());  } catch (InterruptedException e) {   e.printStackTrace();  } }}

执行结果:

1.8暂停线程

从执行的时间来看,新开启的线程确实发生了暂停(当前线程暂停与启动的时间与另外开启的线程是一致的),并且能够成功的恢复运行状态。

1.8.2suspend与resume方法的缺点——独占:

在使用suspend与resume方法时,可能会导致公共的同步对象的独占发生,使得其他线程无法访问公共同步对象。

独占代码:

public class SynchronizedObject { synchronized public void printString() {  System.out.println("begin");  if ("a".equals(Thread.currentThread().getName())) {   System.out.println("a线程永远的暂停了,suspend");   Thread.currentThread().suspend();  }  System.out.println("end"); }}

执行代码:

public class Main { public static void main(String[] args) {  try {   final SynchronizedObject object = new SynchronizedObject();   Thread thread1 = new Thread() {    @Override    public void run() {     object.printString();    }   };   thread1.setName("a");   thread1.start();   Thread.sleep(1000);   Thread thread2 = new Thread() {    @Override    public void run() {     System.out.println("因为在Thread1中已经暂停了,后面的语句无法执行,所有只打印了begin");     System.out.println("因为此时Thread1已经进入了线程并且锁定了方法printString()所以什么都打不出来");     System.out.println("这是死锁的一种表现");     object.printString();    }   };   thread2.setName("a");   thread2.start();  } catch (InterruptedException e) {   e.printStackTrace();  } }}

另一种陷阱式的多线程独占问题

线程代码:

public class Thread2 extends Thread { private long i = 0L; @Override public void run() {  while (true) {   i++;   System.out.println(i);  } }}

执行代码:

public class Main { public static void main(String[] args) {  try {   Thread2 thread = new Thread2();   thread.start();   Thread.sleep(1000);   thread.suspend();   System.out.println("main end");  } catch (InterruptedException e) {   e.printStackTrace();  } }}

执行结果:

1.8暂停线程卡在数字后面,并没有打印出main end。

原因是在于println()方法,查看其源码会更加清晰:

1.8暂停线程

 

由源码可以得知,在println内部存在同步锁,当线程在println()内部停止时,同步锁就永远不会释放,就会导致死锁。  

1.8.3suspend与resume方法的缺点——不同步:

使用这两个方法容易出现数据不同步的情况。

共享数据类:

public class MyObject { private String username = "1"; private String password = "11"; public void setValue(String u,String p) {  this.username = u;  if("a".equals(Thread.currentThread().getName())) {   System.out.println("停止a线程");   Thread.currentThread().suspend();  }  this.password = p; } public void printUsernamePassword() {  System.out.println(username + "|||" + password); }}

执行代码:

public class Main { public static void main(String[] args) {  try {   final MyObject object = new MyObject();   Thread thread = new Thread() {    @Override    public void run() {     object.setValue("a","aa");    }   };   thread.setName("a");   thread.start();   Thread.sleep(1000);   Thread thread1 = new Thread() {    @Override    public void run() {     object.printUsernamePassword();    }   };   thread1.start();  } catch (InterruptedException e) {   e.printStackTrace();  } }}

执行结果:

1.8暂停线程

 

原标题:1.8暂停线程

关键词:线程

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。