我有一个循环,这样做:
WorkTask wt = new WorkTask();
wt.count = count;
Thread a = new Thread(wt);
a.start();
运行workTask时,计数将为wt ++, 但是WorkTask似乎没有改变计数,而且在线程之间,变量无法在两个线程内共享,我写错了什么?谢谢。
答案 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();