2017-03-01 49 views
3
import java.lang.*; 

class MyRun implements Runnable 
{ 
    public static int start = 0; 
    public void run() 
    { 
    int myCounter = 0; 
    System.out.println(Thread.currentThread().getName()+" is waiting on start flag"); 
    while(start<1) 
    { 
     // just waiting...   
    } 
    while(myCounter<5) 
    { 
     myCounter++; 
     System.out.println(Thread.currentThread().getName()+" : "+myCounter); 
     try 
     { 
     Thread.sleep(1000); 
     } catch(Exception ex) {} 
    } 
    System.out.println(Thread.currentThread().getName()+" stopped and start="+start); 
    } 
} 

public class test 
{ 
    public static void main(String[] args) 
    { 
    Thread[] threads = new Thread[10]; 
    for(int i=0; i<10; i++) 
    { 
     int p = i+1; 
     threads[i] = new Thread(new MyRun()); 
     threads[i].setName("TH"+p); 
     threads[i].setPriority(p); 
     threads[i].start(); 
    } 
    MyRun.start=1; // signaling GO 
    } 
} 

輸出:Java線程:由於程序無法正常運行

TH1 is waiting on start flag 
TH2 is waiting on start flag 
TH3 is waiting on start flag 
TH4 is waiting on start flag 
TH5 is waiting on start flag 
TH6 is waiting on start flag 
TH8 is waiting on start flag 
TH7 is waiting on start flag 
TH9 is waiting on start flag 
TH10 is waiting on start flag 
TH10 : 1 
TH10 : 2 
TH10 : 3 
TH10 : 4 
TH10 : 5 
TH10 stopped and start=1 

我是從爲開始標誌設置爲1,但只執行名稱TH10線程的所有線程期待輸出。

你能幫我找出在這段代碼中發生什麼事嗎?

我想用這樣的代碼做什麼?

Ans:嘗試分析線程的優先級(特別是使用共享靜態變量超過可運行時清除我的線程概念,特別是多線程)。

在此先感謝您,讓我知道您是否需要我身邊的任何信息。

更新:將所有線程視爲馬,當MyRun.start設置爲1(它應該被視爲所有馬的GO信號),但只有第10匹馬在信號後運行。

+2

對不起,這不是StackOverflow的是如何工作的。問題形式_「這是我的一堆代碼,請爲我調試」_被認爲是無關緊要的。請訪問[幫助]並閱讀[問]以獲取更多信息。 –

+2

我認爲這是一個合適的問題,因爲它是關於一個特定的問題,而不僅僅是「我的代碼不工作」 – Mike76

+0

@JimGarrison在所有方面,我沒有要求調試它,但它只發生在優先事項時,沒有優先權它的完美。所以我錯過了線程優先級的概念,,,所以需要在該領域的幫助。 –

回答

2

該代碼至少有兩個問題:

  • 它使用公開不同步的變量(start)這始終是一個代碼味道盡可能多線程而言=>也不能保證你的線程看到start
  • 正確的值不會等待線程完成自己的任務

正確的方式來實現這樣的事情是在java.util.concurrent包使用範例。在這種情況下,這將是CountDownLatch es

在Javadoc中提供的示例實際上非常接近您在此嘗試實現的目標(開始所有線程,等待它們完成),因此我正在重現它。 MyRun下面是Worker;在doWork()中,請執行run()方法的內容

startSignal「鎖存」所有「等待」它的線程的開始。 的doneSignal「鎖定」的程序(main)結束,一旦所有線程結束一直以「倒計時」

class Driver { // ... 
    void main() throws InterruptedException { 
    CountDownLatch startSignal = new CountDownLatch(1); 
    CountDownLatch doneSignal = new CountDownLatch(N); 

    for (int i = 0; i < N; ++i) // create and start threads 
     new Thread(new Worker(startSignal, doneSignal)).start(); 

    doSomethingElse();   // don't let run yet 
    startSignal.countDown();  // let all threads proceed 
    doSomethingElse(); 
    doneSignal.await();   // wait for all to finish 
    } 
} 

class Worker implements Runnable { 
    private final CountDownLatch startSignal; 
    private final CountDownLatch doneSignal; 
    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { 
     this.startSignal = startSignal; 
     this.doneSignal = doneSignal; 
    } 
    public void run() { 
     try { 
     startSignal.await(); 
     doWork(); 
     doneSignal.countDown(); 
     } catch (InterruptedException ex) {} // return; 
    } 

    void doWork() { ... } 
} 
+0

我接受你的答案,因爲它適當地做同樣的事情......但我仍然無法弄清楚我的程序有什麼問題(確切地說)。 –