Java多线程编程核心技术(第3版)
上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()方法。