Java 如何打印100?

Java 如何打印100?,java,multithreading,Java,Multithreading,我想在下面的程序中打印100作为输出 我得到的答案是0 class s extends Thread{ int j=0; public void run() { try{Thread.sleep(5000);} catch(Exception e){} j=100; } public static void main(String args[])

我想在下面的程序中打印100作为输出

我得到的答案是0

    class s extends Thread{
    int j=0; 
        public void run() { 
            try{Thread.sleep(5000);} 
            catch(Exception e){} 
            j=100; 
        } 
        public static void main(String args[]) 
        { 
            s t1=new s(); 
            t1.start(); 
            System.out.println(t1.j); 
        } 

}

您需要等待
线程
完成..我为您添加了一个调用,它将阻止并等待
线程
完成,然后再查看
j
的值:

class s extends Thread{
    int j=0; 
    public void run() { 
        try{ Thread.sleep(5000); } catch( Exception e ){} 
        j = 100; 
    } 

    public static void main(String args[]) throws InterruptedException { 
        s t1=new s(); 
        t1.start(); 
        t1.join() ; // Wait for t1 to finish
        System.out.println(t1.j); 
    } 
}

您必须将t1连接到main。 因此,父线程(main())将等待子线程完成。

Join t1

t1.join

因此,主线程将等待

,只需将线程t1连接到主线程

t1.join

什么会改变同步块?您确实需要同步对
j
的访问,或者声明它
volatile
。即使在基元类型上也有可能获得过时的读取。布莱恩·戈茨比我更能解释为什么。不过,+1为OP提供了正确的想法。是的,我可能会使用FutureTask之类的东西,或者GPAR或akka之类的框架,但我觉得这超出了问题的范围;-)另外,如果我是错误的大师,请纠正我,而不是直接访问“s”class'变量,您应该包括一个访问器方法来打印j的值。@theox:这将是一个良好的实践。这里更重要的是同步访问
j
(或者声明它
volatile
)。即使在
s
线程完成对主线程的写入之后,主线程也可能(尽管不太可能)看到过时的
j
值。请参阅Brian Goetz的书《实践中的Java并发性》,以了解为什么这是正确的。