如何根据 CPU 内核扩展线程?

2022-08-31 09:32:16

我想用Java中的多个线程解决一个数学问题。我的数学问题可以分成工作单元,我想在几个线程中解决。

我不想让固定数量的线程在它上面工作,而是要有一个与CPU内核数量匹配的线程数量。我的问题是,我无法在互联网上找到一个简单的教程。我找到的都是具有固定线程的示例。

如何做到这一点?您能举例说明吗?


答案 1

您可以使用静态运行时方法(可用处理器)确定可用于 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();
}

有关创建自己的线程的详细信息,请转到本教程。此外,您可能希望查看线程池以创建线程。


答案 2

您可能也想看看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

这比处理自己的线程池等要好得多。