2011-03-27 36 views
0

我的問題是如何讓一個線程運行,然後在另一個運行之後,然後再運行另一個運行,然後重複自身。試圖按特定順序每次循環3個線程

我有一個主文件

private static ThreadManager threadManager; 

public static void main(String[] args) 
{ 
    threadManager = new ThreadManager(); 
} 

然後,我有一個ThreadManager類

public class ThreadManager { 
public static final Object lock1 = new Object(); 

public static ConcThread CT = new ConcThread(); 
public static SocketThread sThread = new SocketThread(); 
public static PacketThread packetThread = new PacketThread(); 

public ThreadManager() { 
    try { 
     synchronized (lock1) { 
      packetThread.packetThread.start(); 
       lock1.wait(); 
      CT.concThread.start(); 
       lock1.wait(); 
      sThread.socketThread.start(); 
     } 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
    } 
} 

然後,我有3個線程

 public class PacketThread implements Runnable { 

     public Thread packetThread = new Thread(this); 

     public void run() { 
      while (true) { 
       try { 
        synchronized (ThreadManager.lock1) { 
         //DoThing1 
         synchronized (this) { 
          ThreadManager.lock1.notifyAll(); 
         } 
         ThreadManager.lock1.wait(); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    public class ConcThread implements Runnable { 

    public Thread concThread = new Thread(this); 

    public void run() { 
     while (true) { 
      synchronized (ThreadManager.lock1) { 
       try { 
        //dothing2 
       synchronized (this) { 
        ThreadManager.lock1.notifyAll(); 
       } 
       ThreadManager.lock1.wait(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

    public class SocketThread implements Runnable { 

    public Thread socketThread = new Thread(this); 

    public void run() { 
     while (true) { 
      synchronized (ThreadManager.lock1) { 
       try { 
        //dothing3 
        synchronized (this) { 
         ThreadManager.lock1.notifyAll(); 
        } 
        ThreadManager.lock1.wait(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

您可以嘗試以更精確的方式告訴我們您要完成什麼,而不是強迫我們從代碼中「逆向工程」您的想法? – akappa 2011-03-27 05:35:50

+0

你想讓你的線程等待早期線程完成嗎?或者你是否僅僅想連續觸發三個線程,而不管線程的結果如何? – 2011-03-27 05:36:57

+2

這是C#嗎?我不認爲C#有「同步」或「執行」關鍵字...這看起來像Java ... – 2011-03-27 05:40:18

回答

2

而不是具有單個鎖之間共享三個線程(它決定了線程釋放鎖後哪個線程將會啓動),有三個單獨的信號量/鎖,其中線程#1在其任務完成後爲線程#2解鎖信號量,線程#2解鎖線程#3的信號量,並且線程#3解鎖線程#1的信號量。

所以它看起來是這樣的:

  1. 線程#1運行(線#2和線程#3是目前已封鎖)
  2. 線程#1完成
  3. 線程#1解鎖信號線程#2
  4. 線程#1塊
  5. 線程#2運行
  6. 線程#2完成
  7. 線程#2解鎖旗語用於線#3
  8. 線程#2塊
  9. 線程#3的運行
  10. 線程#3完成
  11. 線程#3解鎖旗語用於線#1
  12. 線程#3塊

希望這有助於

傑森

0

您是否考慮過查看Runnable來識別您擁有的大量工作,以及一個合適的執行程序來控制什麼時候運行?