【问题标题】:Run a function using multiple threads [closed]使用多线程运行一个函数[关闭]
【发布时间】:2022-12-01 08:38:51
【问题描述】:

我是 Java 多线程的新手,我想知道是否可以使用多个线程运行一个函数:

假设我有这个功能:

function void foo() 
   // do something here

我可以创建一个线程数组,例如总共 4 个线程,然后在这些线程上执行该函数吗?

loop for threads
   function void foo(); // now the function will run on all 4 threads and finish its execution faster
end loop

编辑:

在看到 cmets 之后,这里有一些更多的细节。 我知道如何开始新线程,这不是问题。 我拥有的函数 foo 在大约 3 分钟内处理一个 CSV 文件。 我想知道是否有任何我可以使用多个线程“启动”(调用)这个函数,以便它更快地完成。

【问题讨论】:

  • Java 中没有“神奇地将这个方法调用的工作分散到 4 个线程”的机制。如果你想将单个方法的工作分散到 4 个线程上,你需要找到一种方法将它分成独立的工作块。这可能/不可能/容易,具体取决于您的方法的作用。
  • 我想知道是否可能“ 这是可能的。

标签: java multithreading


【解决方案1】:

您可以创建一个实现 Runnable 的类,如下所示:

public class Action implements Runnable {

    @Override
    public void run() {
        System.out.println("do your stuff ...");
    }
}

总的来说,你可以做这样的事情:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

        var threads = new ArrayList<Thread>();

        threads.add(new Thread(new Action()));
        threads.add(new Thread(new Action()));
        threads.add(new Thread(new Action()));
        threads.add(new Thread(new Action()));

        for (Thread t : threads) {
            t.start();
        }

    }
}

Runnable 接口让你实现线程启动时自动调用的方法run()

你也可以避免使用ArrayList

public class Main {
    public static void main(String[] args) {

        new Thread(new Action()).start();
        new Thread(new Action()).start();
        new Thread(new Action()).start();
        new Thread(new Action()).start();
    }
}

【讨论】:

  • 它有效,但这不是我在 2022 年描述的惯用 Java。你不需要这个类。它可以是 Main 的私有静态方法,只需使用 new Thread(Main::myTask)。我也不会显式创建线程。我会用Executors.newFixedThreadPool(4)
  • 这个答案不太可能有帮助。你回答了OP的文字问题——你展示了如何启动四个线程来运行相同的函数——但是 OP 需要知道如何以一种允许每个线程完成整个工作的自己的部分的方式编写函数,并且允许结果在什么时候进行有意义的组合所有的部分都完成了。当然,如果不知道这份工作到底是什么,就无法回答这个问题。
  • @SolomonSlow 您做出了一些不一定正确的假设。我没有看到任何迹象表明这些线程需要分而治之。
  • @Michael,您是在暗示 OP 已经知道如何编写多线程代码,只需要有人告诉他们如何实际启动线程。你是对的。如果 OP 有使用其他编程语言的经验,但对 Java 不熟悉,并且懒得在 Javadoc 中查找答案,那将是可能的。也许这就是我决定不否决这个答案或投票关闭它的原因。 (是否投票关闭问题尽管。)
  • 创建Runnable类@Michael 比直接调用方法更为常见。郑重声明,Main::myTask 仍在创建匿名类,只是它对您隐藏了 new Action()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多