当前位置: 代码迷 >> Java相关 >> 请问大神-JAVA线程同步后,使用wati、notify不能退出主程序有关问题,请入内指点
  详细解决方案

请问大神-JAVA线程同步后,使用wati、notify不能退出主程序有关问题,请入内指点

热度:14   发布时间:2016-04-22 21:09:39.0
请教大神--JAVA线程同步后,使用wati、notify不能退出主程序问题,请入内指点

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没有人来唤醒,一直卡在这了。至于你用的后台进程那是主线程执行完毕就退出,不论后台线程是否执行完毕。  不知道是不是这样,我也是个菜,希望对你有所帮助
  相关解决方案