当前位置: 代码迷 >> J2SE >> 关于JAVA线程,请大神帮忙解决思路
  详细解决方案

关于JAVA线程,请大神帮忙解决思路

热度:95   发布时间:2016-04-23 20:00:33.0
关于JAVA线程,请大神帮忙
public class TestThread {

    public static void main(String[] args) {
        IRun ir = new IRun();
        Thread it = new Thread(ir);
        it.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex);
        }
        ir.setStop();
    }

    static class IRun implements Runnable {
        boolean exec = true;
        public void setStop() {
            exec = false;
        }
        @Override
        public void run() {
            int c = 0;
            while (exec) {
               String s = new String();
                c++;
            }
            System.out.println("退出了循环");
        }
    }
}

在上面的程序中,调用IRun的setStop()函数停止线程中的循环,而后输出一信息表明了循环。而测试中,关键却在第24句,如果没有第24句测下面的信息不会输出,程序也不会退出。经实验,在while循环中如果有类对象的操作(新建、调用函数),程序能够中断循环。但如果是调用类的函数返回基本类型也不会正常退出循环,请大神帮忙,看看产生现象的原因
------解决思路----------------------
可能的原因:JVM内部优化机制导致了可见性问题。(因为没有添加其他非基本类型的操作时,while循环执行的时间非常短,而JVM可能在对待读取的exec值时,是根据循环的次数做了一个统计,发现若干次循环执行的结果exec值都是不变的,结果就做了一个优化,对exec进行了内联处理(即不对exec进行读取,而是用true值替代exec)。加上volatile是告诉JVM这个变量是不稳定的,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。而在while里面添加一个非基本类型的数据操作,使得这个循环的操作时间相对拉长了,在JVM进行优化的处理时,这个时候进行统计,发现exec是发生改变的,而不做前述的内联处理了,因而效果跟用volatile关键字一样。
  相关解决方案