如何在java中的两个线程之间共享变量?

时间:2012-03-13 02:15:28

标签: java multithreading

我有一个循环,这样做:

            WorkTask wt = new WorkTask();
            wt.count = count;
            Thread a = new Thread(wt);
            a.start();

运行workTask时,计数将为wt ++, 但是WorkTask似乎没有改变计数,而且在线程之间,变量无法在两个线程内共享,我写错了什么?谢谢。

3 个答案:

答案 0 :(得分:2)

如果没有看到WorkThread的代码,就很难确定问题,但很可能你缺少两个线程之间的同步。

无论何时启动线程,都无法保证原始线程或新创建的线程是先运行还是如何调度。 JVM /操作系统可以选择运行原始线程完成,然后开始运行新创建的线程,运行新创建的线程完成,然后切换回原始线程或其间的任何内容。

为了控制线程的运行方式,您必须明确地同步它们。有几种方法可以控制线程之间的交互 ​​- 当然在单个答案中描述的太多了。我建议the concurrency trail Java教程进行广泛的概述,但在特定情况下,启动的同步机制可能是Thread.join和synchronized关键字(描述了这个关键字的一个特定用途)在the Java tutorials)。

答案 1 :(得分:1)

使count变量为static(看起来每个线程现在都有自己的变量版本)并使用互斥锁使其线程安全(即使用同步指令)

答案 2 :(得分:1)

根据您的描述,我想出了以下内容,以展示我认为您的问题。此代码应输出42.但它输出41.

public class Test {
static class WorkTask implements Runnable {
    static int count;
    @Override
    public void run() {
        count++;
    }
}
public static void main(String... args) throws Exception {
    WorkTask wt = new WorkTask(); 
    wt.count = 41; 
    Thread a = new Thread(wt); 
    a.start();
    System.out.println(wt.count);
}
}

问题是由于在线程有机会启动之前运行了print语句。

要使当前线程(将要读取变量计数的线程)等到线程完成,请在启动thre线程后添加以下内容。

a.join();