6
public class Test { 
    private ExecutorService executor = Executors.newFixedThreadPool(50); 

    public void startTenThreads() { 
     for (int i = 0; i < 10; i++) { 
      executor.execute(new FooWorker(i)); 
     } 
    } 

    private final class FooWorker implements Runnable { 
     private int threadNum; 

     public FooWorker(int threadNum) { 
      this.threadNum = threadNum; 
     } 

     public void run() { 
      System.out.println("Thread " + threadNum + " starting"); 
      Thread.sleep(60000); 
      System.out.println("Thread " + threadNum + " finished"); 
     } 
    } 
} 

我想这些线程并行运行,但是输出显示它不是并行运行,而是按顺序:为什么我的线程不能使用Java ExecutorService并行运行?

Thread 1 starting 
Thread 1 finished 
Thread 2 starting 
Thread 2 finished 
Thread 3 starting 
Thread 3 finished 
Thread 4 starting 
Thread 4 finished 
Thread 5 starting 
Thread 5 finished 
... 

我在做什么错?

编辑:发现问题,有人已经建立线程池的大小为1。该段代码工作作为写不编译罚款

+4

因为您的任务需要这样的排序时间来完成它们在下一次循环迭代之前执行。你需要提供更多的工作线索 - 也许随机睡眠。另请参见['invokeAll'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#invokeAll(java.util.Collection))。 –

+0

您需要打印更多行。你正在处理竞争条件,线程正在完成得太快。 – Gray

+0

我把Thread.sleep(60000),它仍然按照与Boris the Spider所说的相同的顺序打印 – Popcorn

回答

1

您的代码。我猜你在代码中还有其他的东西,你没有在这里剪切/粘贴。这里是你编写的代码来编译。我测试了它,它适用于我。你的实际代码和下面的代码有什么区别? (请原谅“TheadTest”中的错字)。

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

public class TheadTest { 

    private ExecutorService executor = Executors.newFixedThreadPool(50); 

    public void startTenThreads() { 
     for (int i = 0; i < 10; i++) { 
      executor.execute(new FooWorker(i)); 
     } 
    } 

    private final class FooWorker implements Runnable { 
     private int threadNum; 

     public FooWorker(int threadNum) { 
      this.threadNum = threadNum; 
     } 

     public void run() { 
      try { 
       System.out.println("Thread " + threadNum + " starting"); 
       Thread.sleep(60000); 
       System.out.println("Thread " + threadNum + " finished"); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     TheadTest tt = new TheadTest(); 
     tt.startTenThreads(); 
    } 

} 
+0

有很多不同之处,所以我不认为我可以将它全部粘贴。我仍然试图弄清楚这一点,但要点是我使用apache http客户端发送http请求,并且我希望它们全部并行运行。我认为这可能与使用HttpClient而不是AsyncHttpClient有关。仍在研究它 – Popcorn

相关问题