为了账号安全,请及时绑定邮箱和手机立即绑定

Java:如何根据cpu内核扩展线程?

Java:如何根据cpu内核扩展线程?

POPMUISE 2019-11-11 15:57:33
我不是一个优秀的Java程序员,这只是我的业余爱好,但是我渴望了解的东西比一般的东西还多。我想用java中的多线程解决数学问题。我的数学问题可以分为多个工作单元,我想通过几个线程来解决。但我不想在其上使用固定数量的线程,而希望将一定数量的线程与cpu核心数量相对应。我的问题是,为此我在互联网上找不到简单的教程。我发现的只是带有固定线程的示例。那么,您可以帮我链接到一个很好的教程,还是可以给我一个简单而良好的例子?那真的很好:)
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您可以通过使用静态运行时方法,确定提供给Java虚拟机的进程数availableProcessors。确定可用处理器的数量后,请创建该线程数量,并相应地拆分工作。


更新:为了进一步阐明,线程只是Java中的一个对象,因此您可以像创建其他任何对象一样创建它。因此,假设您调用上述方法,发现它返回了2个处理器。太棒了 现在,您可以创建一个循环,该循环生成一个新的线程,并拆分该线程的工作,然后触发该线程。这是一些伪代码来说明我的意思:


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();

}

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


查看完整回答
反对 回复 2019-11-11
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

这比应付自己的线程池等要好得多。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 340 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信