Java 如何打印100?
我想在下面的程序中打印100作为输出 我得到的答案是0Java 如何打印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[])
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并发性》,以了解为什么这是正确的。