如何在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();