2012-10-23 31 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