2013-04-03 101 views
0

我遇到了多線程問題。 當我使用wait()和notify()或join()時,我得到InterruptedException。 我有一個WHILE循環中有2個線程,我想等到它們都完成。 這是我的代碼:多線程問題不能等待線程完成

while (!GamePanel.turn) 
    { 
     if(GamePanel.s.isRunning) 
     { 
      synchronized (GamePanel.s.thread) 
      { 
       try { 
        GamePanel.s.thread.join(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     //Player selected random moves 
     if(GamePanel.selectedMove == 1) 
     { 
      //Get computer's Random move. 
      strategy.getRandomMove(); 
     } 
     else 
     { 
      //Player selected AI moves 
      if(GamePanel.selectedMove == 2) 
      { 
       //Get computer's AI move. 
       strategy.getMove(); 
       System.out.println(strategy.move); 

      } 
     } 


     //Perform the next move of the computer. 
     Rules.makeMove(GamePanel.dimples, strategy.move, false); 
    } 

兩個strategy.getMove()和Rules.makeMove()是線程。 爲每個線程我已經創建了自己的start()和stop()方法:

public void start() 
//This function starts the thread. 
{ 
    if (!isRunning) 
    { 
     isRunning = true; 
     thread = new Thread(this); 
     thread.setPriority(Thread.NORM_PRIORITY); 
     thread.start(); 
    } 
} 
private void stop() 
//This function stops the thread. 
{ 
    isRunning = false; 
    if (thread != null) 
    { 
     thread.interrupt(); 
    } 
    thread = null; 
} 

我也試圖做使用Thread.stop(),但還是同樣的問題。 我的問題是如何讓WHILE循環等待兩個線程完成?

+0

你的stop方法不會停止它中斷線程的線程。或者至少看起來是這樣的。你可以在線程運行方法中顯示你的代碼嗎? – linski

+0

public void run() { \t //某些代碼 \t thread.sleep(delayAfterMove); \t //某些代碼 \t stop(); } – Ron537

回答

4

您可能會考慮將您的代碼切換爲使用CountDownLatch。您可以創建類似下面的插銷,所有3個線程將分享:

countDown.countDown(); 

而你等待的線程會做:

final CountDownLatch latch = new CountDownLatch(2); 

然後當他們完成你的兩個線程將遞減計數器

countDown.await(); 

後兩個線程完成它會被喚醒,並鎖存變爲0

+0

我不明白我應該在哪裏使用它? – Ron537

+1

而不是'GamePanel.s.thread.join();''你可能會''GamePanel.countDown.await();''。你的遊戲線程和第三個線程都需要共享該鎖存器@Ren537。 – Gray

+0

仍然同樣的問題 java.lang.InterruptedException \t在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(未知來源) \t在java.util.concurrent.CountDownLatch.await(未知來源) \t在Mancala.Computer .DoStep(Computer.java:28) \t at Mancala.Sleep.run(Sleep.java:94) \t at java.lang.Thread.run(Unknown Source) – Ron537