上QQ阅读APP看书,第一时间看更新
1.12.3 方法suspend()与resume()的缺点——数据不完整
使用suspend()与resume()方法时也容易出现因为线程暂停导致数据不完整的情况。
创建项目suspend_resume_nosameValue,文件MyObject.java代码如下:
package myobject; public class MyObject { private String username = "1"; private String password = "11"; public void setValue(String u, String p) { this.username = u; if (Thread.currentThread().getName().equals("a")) { System.out.println("停止a线程!"); Thread.currentThread().suspend(); } this.password = p; } public void printUsernamePassword() { System.out.println(username + " " + password); } }
文件Run.java代码如下:
package test; import myobject.MyObject; public class Run { public static void main(String[] args) throws InterruptedException { final MyObject myobject = new MyObject(); Thread thread1 = new Thread() { public void run() { myobject.setValue("a", "aa"); }; }; thread1.setName("a"); thread1.start(); Thread.sleep(500); Thread thread2 = new Thread() { public void run() { myobject.printUsernamePassword(); }; }; thread2.start(); } }
程序运行结果如图1-59所示。
图1-59 运行结果
程序运行结果出现值不完整的情况,所以在程序中使用suspend()方法时要格外注意。
鉴于这两个方法均被标识为作废过期,所以想要实现对线程进行暂停与恢复的处理时可使用wait()、notify()或notifyAll()方法。