2012-10-23 30 views
0

寫了多線程程序的順序打印出單雙號直到序列達到30回到命令行程序時輸出完成

import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 
import java.util.concurrent.atomic.AtomicInteger; 

public class NumPrintTX 
{ 
public static void main(String[] args) 
{ 
    final int max = 31; 
    final AtomicInteger i = new AtomicInteger(0); 
    Executor dd = Executors.newFixedThreadPool(2); 

    final Object lock = new Object(); 

    dd.execute(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      while (i.get() < max) 
      { 
       if (i.get() % 2 == 0) 
       { 
        System.out.print(" " + i.getAndAdd(1)); 

        synchronized(lock) 
        { 
         lock.notify(); 
        } 
       } 
       else 
       { 
        synchronized(lock) 
        { 
         try 
         { 
          lock.wait(); 
         } 
         catch (InterruptedException e) 
         { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    }); 
    dd.execute(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      while (i.get() < max) 
      { 
       if (i.get() % 2 != 0) 
       { 
        System.out.print(" " + i.getAndAdd(1)); 

        synchronized(lock) 
        { 
         lock.notify(); 
        } 
       } 
       else 
       { 
        synchronized(lock) 
        { 
         try 
         { 
          lock.wait(); 
         } 
         catch (InterruptedException e) 
         { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    }); 
    do 
    { 
     try 
     { 
      Thread.currentThread().sleep(1000); 
      } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    while (i.get() != max); 
} 
} 
程序運行時

,它出來就好了,但它不會進入下一行,所以我可以輸入另一個命令,用於接下來要做的任何事情。任何想法,爲什麼這是我能做些什麼來解決它?

修改後的代碼: import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger;

public class NumPrintTX 
{ 
public static void main(String[] args) 
{ 
    final int max = 31; 
    final AtomicInteger i = new AtomicInteger(0); 
    Executor dd = Executors.newFixedThreadPool(2); 

    final Object lock = new Object(); 

    dd.execute(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      while (i.get() < max) 
      { 
       if (i.get() % 2 == 0) 
       { 
        System.out.print(" " + i.getAndAdd(1)); 

        synchronized(lock) 
        { 
         lock.notify(); 
        } 
       } 
       else 
       { 
        synchronized(lock) 
        { 
         try 
         { 
          lock.wait(); 
         } 
         catch (InterruptedException e) 
         { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    }); 
    dd.execute(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      while (i.get() < max) 
      { 
       if (i.get() % 2 != 0) 
       { 
        System.out.print(" " + i.getAndAdd(1)); 

        synchronized(lock) 
        { 
         lock.notify(); 
        } 
       } 
       else 
       { 
        synchronized(lock) 
        { 
         try 
         { 
          lock.wait(); 
         } 
         catch (InterruptedException e) 
         { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    }); 
    do 
    { 
     try 
     { 
      Thread.currentThread().sleep(1000); 
      } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    while (i.get() != max); 
} 
public void close() 
{ 
System.exit(0); 
} 
} 

回答

1

你不能阻止你的線程池,所以它不是讓你的主程序結束。

考慮下面的代碼:

import java.util.concurrent.Executors; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.atomic.AtomicInteger; 

class Worker implements Runnable { 
    private AtomicInteger i; 
    private Object lock; 
    private int max; 
    private int mod; 

    Worker(AtomicInteger i_, Object lock_, int max_, int mod_){ 
     this.i = i_; 
     this.lock = lock_; 
     this.max = max_; 
     this.mod = mod_; 
    } 

    @Override 
    public void run(){ 
     while (i.get() < max) 
     { 
      if(i.get() % 2 == mod) 
      { 
       System.out.print(" " + i.getAndAdd(1)); 

       synchronized(lock){ lock.notify(); } 
      } 
      else 
      { 
       synchronized(lock) 
       { 
        try { lock.wait(); } 
        catch (InterruptedException e) { e.printStackTrace(); } 
       } 
      } 
     } 
    } 
} 

public class NumPrintTX 
{ 
    public static void main(String[] args) 
    { 
     final int max = 31; 
     final AtomicInteger i = new AtomicInteger(0); 
     ExecutorService dd = Executors.newFixedThreadPool(2); 

     final Object lock = new Object(); 

     dd.execute(new Worker(i, lock, max, 0)); 
     dd.execute(new Worker(i, lock, max, 1)); 

     dd.shutdown(); 
    }  
} 

沒有dd.shutdown(),你的程序將被掛起,儘管越來越到底。

主do-while循環和System.exit(0)會工作,但似乎有點「蠻力」。

此外,此代碼簡化了您的線程代碼,使其更易讀,而無需更改基礎邏輯。

+0

你可以更具體一點嗎? –

+0

我剛剛用代碼更新了我的答案。 – jedwards

+0

試過了。當我去編譯它時,它給了我一個'錯誤:找不到符號' –

-1

您需要明確關閉程序。所以,這樣的事情:

public void close() { 
    // Put any closing code here, like joining Threads or whatever 
    System.exit(0); // 0 means it is a normal exit, i.e. there are no errors 
} 
+0

沒有你說的 –

+0

沒有工作。你究竟在哪裏說要放? –

+0

您必須在希望程序結束的位置實際調用該方法,但不能將其放在那裏並期望它發生。 > _ < – ChemicalRocketeer