public class ThreadDemo extends Thread {
//对象锁控制wait和notify
private Object lock;
private String printStr;
public ThreadDemo(Object lock,String printStr) {
this.lock = lock;
this.printStr = printStr;
// 将本线程设置为后台进程
// this.setDaemon(true);
}
@Override
public void run() {
try {
for (int i = 0; i < 3; i++) {
// 锁定当前对象lock,执行完本次循环结束后 进行等待
synchronized (lock) {
System.out.println(printStr);
Thread.sleep(100);
lock.notify();
lock.wait();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 设置对象锁
Object lock = new Object();
ThreadDemo th1 = new ThreadDemo(lock,"AA_ThREAD");
ThreadDemo th2 = new ThreadDemo(lock,"BB_ThREAD");
// 启动线程
th1.start();
th2.start();
}
}
当前这个程序运行后,输出的结果是
AA_ThREAD
BB_ThREAD
AA_ThREAD
BB_ThREAD
AA_ThREAD
BB_ThREAD
结果完全没错,是我所需要的!
但重点是程序无法退出,MyEclipse控制台一直处于程序未结束状态(红色的小点一直亮着),不知道代码哪里有问题,请各位大神帮忙看下,不胜感激!
我使用过setDaemon(true) , interrupt() , System.exit(0) 结束线程,都有问题,要么结果少输出几遍,要么出其他问题。
真是晕了,实在没撤来发个贴学习以及请教下!
------解决方案--------------------
你这个main线程已经执行完毕,主要是for循环最后一个wait没有唤醒,所以它一直在等待,在你这个结果中是AA线程已经执行完毕,BB线程for循环的第三次的wait没有人来唤醒,一直卡在这了。至于你用的后台进程那是主线程执行完毕就退出,不论后台线程是否执行完毕。 不知道是不是这样,我也是个菜,希望对你有所帮助