Java多线程无法正常工作
我正在使用带有4个线程的Java多线程无法正常工作,java,multithreading,Java,Multithreading,我正在使用带有4个线程的执行器 Executor exec = Executors.newFixedThreadPool(this.numOfThreads); Runnable requestHandler = new Runnable() { @Override public void run() { try { getImageForURL(spURL,
执行器
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
您每次都在创建一个新池(通过反复调用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。您每次都在创建一个新池(通过反复调用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。您希望循环仅围绕对exec.execute(requestHandler)
的调用,而不是包含在其中的整个代码块,否则每次都会创建一个新的线程池
如果只循环调用exec.execute(requestHandler)
,那么输出应该是这样的(语句的顺序可能会有所不同):
您希望循环仅围绕对exec.execute(requestHandler)
的调用,而不是包含在其中的整个代码块,否则每次都会创建一个新的线程池
如果只循环调用exec.execute(requestHandler)
,那么输出应该是这样的(语句的顺序可能会有所不同):
我在循环内部创建了执行器。将其从循环中取出并按照您提到的那样工作,thanksI在循环中创建了执行器。如您所述,它脱离了循环并正常工作,谢谢在您假设Java多线程不起作用之前,您应该假设您可能做错了什么。在您假设Java多线程不起作用之前,您应该假设您可能做错了什么。