如何在java中的两个线程之间共享变量?
我有一个循环,这样做:如何在java中的两个线程之间共享变量?,java,multithreading,Java,Multithreading,我有一个循环,这样做: WorkTask wt = new WorkTask(); wt.count = count; Thread a = new Thread(wt); a.start(); 运行workTask时,计数将为wt++, 但是WorkTask似乎没有改变计数,在线程之间,变量不能在两个线程内共享,我写错了什么?谢谢 如果看不到工作线程的代码,很难确定问题所在,但很可能是两个线程之间
WorkTask wt = new WorkTask();
wt.count = count;
Thread a = new Thread(wt);
a.start();
运行workTask时,计数将为wt++,
但是WorkTask似乎没有改变计数,在线程之间,变量不能在两个线程内共享,我写错了什么?谢谢 如果看不到
工作线程的代码,很难确定问题所在,但很可能是两个线程之间缺少同步
无论何时启动线程,都无法保证原始线程或新创建的线程是否首先运行,也无法保证它们是如何调度的。JVM/操作系统可以选择将原始线程运行到完成,然后开始运行新创建的线程,将新创建的线程运行到完成,然后切换回原始线程,或者介于两者之间的任何操作
为了控制线程的运行方式,必须显式地同步线程。有几种方法可以控制线程之间的交互——当然,在一个答案中描述的太多了。我建议您阅读Java教程以获得更广泛的概述,但在您的具体案例中,启动同步机制的可能是和synchronized关键字(中介绍了该关键字的一个具体用法)。将count变量设为静态(看起来每个线程现在都有自己的变量版本)并使用互斥锁使其线程安全(即使用同步指令)如果您希望从线程返回结果,我建议您使用Callable
接口和提交它的ExecutorSercive。e、 g:
Future future = Executors.newCachedThreadPool().submit
(new Callable<Interger>()
{
int count = 1000;
@Override public Integer call() throws Exception
{
//here goes the operations you want to be executed concurrently.
return count + 1; //Or whatever the result is.
}
}
//Here goes the operations you need before the other thread is done.
System.out.println(future.get()); //Here you will retrieve the result from
//the other thread. if the result is not ready yet, the main thread
//(current thread) will wait for it to finish.
Future-Future=Executors.newCachedThreadPool().submit
(新的可调用()
{
整数计数=1000;
@重写公共整数调用()引发异常
{
//下面是您希望并发执行的操作。
返回count+1;//或任何结果。
}
}
//下面是在完成另一个线程之前需要执行的操作。
System.out.println(future.get());//这里您将从中检索结果
//另一个线程。如果结果尚未就绪,则主线程
//(当前线程)将等待它完成。
这样,您就不必处理同步问题等。
您可以在Java文档中进一步了解这一点:
根据您的描述,我提出了以下内容来说明我认为您的问题。此代码应输出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语句
要使当前线程(将要读取变量计数的线程)等待线程完成,请在启动线程后添加以下内容
a.join();