最近我面临一个面试,面试官问我什么是你可以分配给线程池的最大线程。我回答说,这将取决于硬件组合。此外,我还可以通过增加线程池中的线程来手动测试执行情况。
他似乎对此不满意。
谁能告诉我们如何决定什么是我们应该使用的最大线程,以获得更好的性能。任何指南链接都将不胜感激(在核心java应用程序中)
发布于 2014-12-01 09:47:03
可以告诉任何人如何决定我们应该使用的最大线程是什么,以获得更好的性能--这绝对不是线程的最大数量。
为了获得最好的性能,线程的数量应该等于处理器核的数(不要忘记使用-XmsYYYYM和-XmxYYYYM,没有它们,当处理器没有将线程分配给内核时,您可能会遇到这样的情况)。
关于最大线程,您的答案是正确的,这取决于硬件和操作系统。在linux上,可以检查它:
cat /proc/sys/kernel/threads-max
编辑.
您可以使用Integer.MAX_VALUE创建线程池。
但是您限制了最大线程使用量的。在我的笔记本电脑上。命令"cat /proc/sys/cat/kernel max“显示了126987。
我运行的代码:
package com.stackoverflow.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestMaxAmountOfThreads {
public static void main(String[] args) {
ExecutorService serivce = Executors.newFixedThreadPool(Integer.MAX_VALUE);
for (int i = 0; i < Integer.MAX_VALUE; i++) {
serivce.submit(new Runnable() {
public void run() {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
}
}
});
System.out.println(i);
}
}
}
输出:
31850 线程"main“中的异常:无法在java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110) at com.stackoverflow.test.TestMaxAmountOfThreads.main(TestMaxAmountOfThreads.java:10)在java.lang.Thread.start(Thread.java:714)的java.lang.Thread.start0(原生方法)创建新的原生线程
因此,我可以只使用31850线程,而不需要调优。
发布于 2014-12-01 10:03:13
ThreadPoolExecutor
类构造函数定义如下所示:
public ThreadPoolExecutor(int corePoolSize,**int maximumPoolSize**,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
可以将整数(Integer.MAX_VALUE
)的最大值分配给maximumPoolSize。将线程池大小设置得太大会导致性能问题。如果同时执行的线程太多,则任务切换开销将成为一个重要因素。
发布于 2014-12-01 10:42:56
计算线程池中可用于更好性能的最大线程数。
这个问题的答案完全取决于每个线程将要执行的任务类型。
一方面,如果您的程序是CPU界,那么运行的线程数不应该高于CPU核心的数量。一些英特尔处理器有一个任务的“超线程”功能,所以你应该考虑禁用超线程。
另一方面,如果您的程序不是CPU绑定的,而是完全IO界的,那么线程的数量不应该超过可用内核数量的2或3倍。如果您有8个内核,那么对于一个IO绑定程序,您不应该超过24个线程。
在中间,如果您的线程池需要执行混合CPU绑定和IO绑定操作,则应该使用不同的输出测试和度量性能,并根据具体情况确定一个合理的数目。没有找到具体数字的理论方法,您应该在特定的应用程序上运行一些具体的基准。
当然,这完全取决于您的程序,如果您有一个完全受IO约束的程序,那么我会说,您只使用一个线程,并利用主要平台中可用的非阻塞异步IO API。在Java中,我们有非阻塞IO (NIO)。
https://stackoverflow.com/questions/27225265
复制相似问题