Java 学习笔记之 Suspend和Resume
Posted AK47Sonic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记之 Suspend和Resume相关的知识,希望对你有一定的参考价值。
Suspend和Resume:
Suspend和Resume使用方法:
以下例子证明了线程确实被暂停了,而且还可以恢复成运行状态。
public class SuspendResumeThread extends Thread{ private long i = 0; public long getI() { return i; } public void setI(long i) { this.i = i; } @Override public void run() { while(true){ i++; } } } public class ThreadRunMain { public static void main(String[] args) { testSuspendResumeThread(); } public static void testSuspendResumeThread(){ try { SuspendResumeThread srt = new SuspendResumeThread(); srt.start(); Thread.sleep(5000); srt.suspend(); System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI()); Thread.sleep(5000); System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI()); srt.resume(); Thread.sleep(5000); srt.suspend(); System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI()); Thread.sleep(5000); System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI()); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果:
Suspend和Resume缺点1-独占:
public class SuspendResumeObject { synchronized public void printString(){ System.out.println("begin"); if(Thread.currentThread().getName().equals("a")){ System.out.println("a thread will suspend."); Thread.currentThread().suspend(); } System.out.println("SuspendResumeObject end"); } } public class ThreadRunMain { public static void main(String[] args) { testSuspendResumeObject(); } public static void testSuspendResumeObject(){ try { final SuspendResumeObject object = new SuspendResumeObject(); Thread t = new Thread(){ @Override public void run() { object.printString(); } }; t.setName("a"); t.start(); Thread.sleep(1000); Thread t2 = new Thread(){ @Override public void run() { System.out.println("Thread 2 start, but can\'t enter printString()"); System.out.println("Because of printString() is blocked by thread a"); object.printString(); System.out.println("Thread 2 complete"); } }; t2.start(); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果:
public class SuspendResumePrintStreamIssue extends Thread{ private long i = 0; @Override public void run() { while (true){ // try { i++; // Thread.sleep(1); System.out.println(i); // } catch (InterruptedException e) { // e.printStackTrace(); // } } } } public class ThreadRunMain { public static void main(String[] args) { testSuspendResumePrintStreamIssue(); } public static void testSuspendResumePrintStreamIssue(){ try { SuspendResumePrintStreamIssue srpsi = new SuspendResumePrintStreamIssue(); srpsi.start(); Thread.sleep(1000); srpsi.suspend(); System.out.println("Main end."); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果:
同样是独占,当程序运行到PrintStream对象println()方法内部停止时,同步锁未被释放。这导致main()方法中的System.out.println("Main end.");不能被执行。
Suspend和Resume缺点2-数据不一致:
public class SuspendResumeDataIssue { private String userName = "1"; private String password = "11"; synchronized public void setValue(String u, String p){ this.userName = u; if(Thread.currentThread().getName().equals("a")){ System.out.println("Thread a suspend."); Thread.currentThread().suspend(); } this.password = p; } public void printUserNamePassword(){ System.out.println(userName + " " + password); } } public class ThreadRunMain { public static void main(String[] args) { testSuspendResumeDataIssue(); } public static void testSuspendResumeDataIssue(){ try { SuspendResumeDataIssue srdi = new SuspendResumeDataIssue(); Thread t1 = new Thread(){ @Override public void run() { srdi.setValue("a", "aa"); } }; t1.setName("a"); t1.start(); Thread.sleep(500); Thread t2 = new Thread(){ @Override public void run() { srdi.printUserNamePassword(); } }; t2.start(); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果:
以上是关于Java 学习笔记之 Suspend和Resume的主要内容,如果未能解决你的问题,请参考以下文章
java方法suspend\resume\yield\setPriority
JAVA多线程suspend,resume和wait,notify的区别
java 多线程7: (suspend方法与resume方法) 挂起与恢复
Java线程中sleep()wait()和notify()和notifyAll()suspend和resume()yield()join()interrupt()的用法和区别
(转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()