2010-11-11 52 views
1

競爭條件相當棘手,因爲我必須learnJava線程化:將值傳入線程(可能是競態條件)

public class MyThread extends Thread { 
    private volatile boolean active; 
    private volatile Job job; 

    public MyThread() { 
     active = true; 
     job = null; 
    } 

    public void run() { 
     while (isActive()) { 
      if(job != null) { 
       doIt(); 
      } 
     } 
    } 

    public void finish() { 
     this.active = false; 
    } 

    public boolean isActive() { 
     return active; 
    } 

    private void doIt() { 
     int c = job.a + job.b; 
     job.result(c); 
     job = null; 
    } 

    public call processJob(Job j) { 
     this.job = j; 
    } 
} 

這正常工作,如果我使用的線程低量,但是當大量人同時運行運行到的問題。通過問題我的意思是job.result(c);不被稱爲一些線程,雖然他們都沒有被停止。

我假設發生這種情況是因爲如果通過processJob(j)從不同的進程調用,我無法正確添加作業。 問題:我應該怎麼做纔對?

+0

您如何計劃設置(或修改)工作並激活? – 2010-11-11 23:57:19

+0

而問題是? – 2010-11-12 00:04:28

回答

2

在我看來,你似乎有一個consumer/producer設計。

我建議你使用線程安全集合,如BlockingQueue(或類似的東西)將數據從一個線程傳遞到另一個線程。

2

除了aioobe所說的,我會建議停止使用Thread類來完成這項工作,而是在java中使用併發包。您可以創建Callable課程並使用取消課程,該課程從ExecutorService返回。