2013-08-19 93 views
-2

假設我有3個執行線程,下面介紹每個線程將執行的操作。複雜線程控制

線程1 - 主線程 線程2 - 檢測器線程 線程3 - 動作螺紋

當線程1周開始,它產生線2線程2將簡單地同時運行的線程1和搜索的事件。當事件發生時,我想讓線程2產生一個新的線程,線程3.我想讓線程3與線程1連接。這可能嗎?

示例代碼:

public class ThreadA { 

// variable to flag if ThreadB should still loop 
private static boolean runThreadB = true; 

public void mainMethod() { 

    new ThreadB().start(); 

    // do some stuff 

    // make sure thread B can end 
    runThreadB = false; 

} 

// inner class/Thread B 
class ThreadB extends Thread { 

    @Override 
    public void run() { 

     // loop until Thread A is done 
     while (runThreadB) { 

      // wait for event, if event is found, spawn thread C 
      ThreadC threadC = new ThreadC(); 
      threadC.start(); 

      /** 
      * Need thread C to somehow join ThreadA 
      */ 
      try { 
       threadC.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 

    } 

} 

}

public class ThreadC extends Thread { 

@Override 
public void run() { 

    // perform some tasks 

} 

}

+2

是的,這是可能的。但是很多事情都是可能的,包括無意義的東西,以及沒有提供實用性的東西。你可能會問更具體的問題,比如「這是個好主意」,還是這裏是我的代碼,爲什麼它不起作用? –

+1

「*加入線程1 *」是什麼意思? –

+0

如果線程1會產生兩個線程,然後等待一個或兩個線程完成,會不會更簡單? – Vadim

回答

1

您必須同步線程。你可以使用ReentrantLock來做到這一點。

這裏是你的問題(事件生產者 - 消費者)一個簡單的例子:

public class Foo{ 
    //... 

    public void consumeEvent() throws InterruptedException{ 
     aLock.lock(); 
     try { 
      while(noEvent){ 
       eventAvailable.await(); 
      } 
      // use the event 
     } finally { 
      sLock.unlock(); 
     } 
    } 

    public void createEvent() throws InterruptedException{ 
     aLock.lock(); 
     try { 
      // add an event 
      eventAvailable.signalAll(); 
     } finally { 
      sLock.unlock(); 
     } 
    } 

    private Lock aLock = new ReentrantLock(); 
    private Condition eventAvailable = aLock.newCondition(); 
} 

你的線程將使用對象從這個類。

Thread eventProducer = ... 
Thread eventConsumer = ... 
eventProducer.start(); 
eventConsumer.start(); 

您的線程已同步。

+0

你能看看我上面的編輯嗎?請幫助顯示我如何使用重入鎖定? – Jason

+0

我增加了一些信息。 – 2013-08-19 20:06:16