2011-11-17 142 views
1

我正在使用4线程的ExecutorJava多线程不能正常工作

Executor exec = Executors.newFixedThreadPool(this.numOfThreads); 
     Runnable requestHandler = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        getImageForURL(spURL, 0); 
       } catch (IOException ex) { 
       } catch (Exception ex) { 
       } 
      } 
     }; 
     exec.execute(requestHandler); 

getImageForURL,我打印线程的名称和输出看起来是这样的。输出看起来不正确,或者它是如何看起来的?

name=pool-1-thread-1 
name=pool-2-thread-1 
name=pool-3-thread-1 
name=pool-4-thread-1 
name=pool-5-thread-1 
name=pool-6-thread-1 
name=pool-7-thread-1 
name=pool-8-thread-1 
name=pool-9-thread-1 
name=pool-10-thread-1 
name=pool-11-thread-1 
name=pool-12-thread-1 
name=pool-13-thread-1 
name=pool-14-thread-1 
+2

你认为Java的多线程不工作之前,你应该假设你也许做错了什么。 –

回答

4

您每次都创建一个新池(通过反复调用newFixedThreadPool)。您可能只想创建一次池(当您启动程序时),并向其提交多个requestHandler

输出应该然后看是这样的:

name=pool-1-thread-1 
name=pool-1-thread-1 
name=pool-1-thread-2 
name=pool-1-thread-1 
name=pool-1-thread-1 
name=pool-1-thread-2 

与线程数上升到4,如果池被充分利用。

+0

我在循环内创建了执行程序。取出它的循环,并按照你所说的工作,谢谢 – user373201

1

你希望你的循环环绕只需调用exec.execute(requestHandler),而不是你在那里的整个代码块,否则你将每次创建一个新的线程池。

如果你身边只是调用exec.execute(requestHandler)循环,那么你的输出应该是这个样子(该语句的顺序可能会有所不同):

pool-1-thread-1 
pool-1-thread-4 
pool-1-thread-3 
pool-1-thread-2 
pool-1-thread-3 
pool-1-thread-4 
pool-1-thread-1 
pool-1-thread-4 
pool-1-thread-3 
+0

感谢您的及时响应 – user373201