我有一個循環,這樣做:如何在java中的兩個線程之間共享變量?
WorkTask wt = new WorkTask();
wt.count = count;
Thread a = new Thread(wt);
a.start();
當workTask運行時,計數將與wt ++, 但WorkTask似乎並不改變計數,而線程之間,變量可以」在兩個線程內共享,我寫錯了什麼?謝謝。
我有一個循環,這樣做:如何在java中的兩個線程之間共享變量?
WorkTask wt = new WorkTask();
wt.count = count;
Thread a = new Thread(wt);
a.start();
當workTask運行時,計數將與wt ++, 但WorkTask似乎並不改變計數,而線程之間,變量可以」在兩個線程內共享,我寫錯了什麼?謝謝。
沒有看到WorkThread
的代碼很難確定問題,但很可能是因爲缺少兩個線程之間的同步。
無論何時啓動線程,都無法保證原始線程或新創建的線程是先運行還是如何計劃。 JVM /操作系統可以選擇運行原始線程到完成,然後開始運行新創建的線程,運行新創建的線程完成,然後切換回原始線程或其他任何中間的任何線程。
爲了控制線程的運行方式,您必須明確地同步它們。有幾種方法可以控制線程之間的交互 - 當然在單個答案中描述太多了。我會推薦使用Java教程的the concurrency trail進行廣泛的概述,但在具體情況下,啓動的同步機制可能是Thread.join和synchronized關鍵字(在the Java tutorials中描述了此關鍵字的一個特定用途)。
使得計數爲靜態變量(它看起來像每個線程都有自己的變量版本現在),並使用一個互斥體,使其線程安全的(即使用同步指令)
如果您希望從一個線程得到一個結果,我會建議你使用Callable 接口和一個ExecutorSercive來提交它。例如:
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.
這樣你就不必處理同步問題等 你可以在Java單證進一步看一下:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html
從你的描述我來與以下內容展示我認爲你的問題。此代碼,應該輸出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);
}
}
的問題是由於之前運行的線程有機會開始打印語句。
要使當前線程(即將讀取變量計數的線程)等待線程完成,請在啓動thre線程後添加以下內容。
a.join();