如何根据 CPU 内核扩展线程?
2022-08-31 09:32:16
我想用Java中的多个线程解决一个数学问题。我的数学问题可以分成工作单元,我想在几个线程中解决。
我不想让固定数量的线程在它上面工作,而是要有一个与CPU内核数量匹配的线程数量。我的问题是,我无法在互联网上找到一个简单的教程。我找到的都是具有固定线程的示例。
如何做到这一点?您能举例说明吗?
我想用Java中的多个线程解决一个数学问题。我的数学问题可以分成工作单元,我想在几个线程中解决。
我不想让固定数量的线程在它上面工作,而是要有一个与CPU内核数量匹配的线程数量。我的问题是,我无法在互联网上找到一个简单的教程。我找到的都是具有固定线程的示例。
如何做到这一点?您能举例说明吗?
您可以使用静态运行时方法(可用处理器)确定可用于 Java 虚拟机的进程数。确定可用处理器数后,创建该线程数并相应地拆分工作。
更新:为了进一步澄清,线程只是Java中的一个对象,因此您可以像创建任何其他对象一样创建它。因此,假设您调用上述方法并发现它返回2个处理器。棒。现在,您可以创建一个循环来生成一个新 Thread,并将该线程的工作拆分开来,然后触发该线程。这里有一些伪代码来说明我的意思:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
您可能也想看看java.util.concurrent框架来了解这些东西。像这样:
ExecutorService e = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// Do work using something like either
e.execute(new Runnable() {
public void run() {
// do one task
}
});
或
Future<String> future = pool.submit(new Callable<String>() {
public String call() throws Exception {
return null;
}
});
future.get(); // Will block till result available
这比处理自己的线程池等要好得多。