【问题标题】:Java invoking thread start in same loopJava调用线程在同一个循环中启动
【发布时间】:2021-06-08 14:51:36
【问题描述】:

我有这个循环为每个线程设置作业 我的问题是如何在同一个循环中启动线程,并避免另一个循环

 List<Thread> works= new ArrayList<Thread>();
        for (final action a : actions) {
            threads.add(new Thread(() -> {
                jobMethod(a);
            }));
        }

这是我想避免的:

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

【问题讨论】:

    标签: java multithreading thread-safety


    【解决方案1】:

    声明一个变量?看起来相当琐碎:

    Thread t = new Thread(() -> jobMethod(a));
    threads.add(t);
    t.start();
    

    【讨论】:

    • join() 怎么样,我可以在同一个循环中添加它吗
    • 显然不会 - join() 会冻结这个线程(只是,阻止线程产生子线程)。没有办法在一个循环中创建 10 个线程,启动它们,让它们同时运行,然后等待所有 10 个线程完成。
    • @user63898 回复,“join() 怎么样...?” 从不编写在启动线程后立即加入线程的代码。使用线程的全部意义在于,您可以启动一个线程,然后在线程运行时执行其他操作。 如果启动新线程的代码除了等待之外什么都不做,那么您就完全无法做到这一点要完成的新线程。
    【解决方案2】:

    只是:

    List<Thread> works= new ArrayList<Thread>();
    for (final action a : actions) {
      // local var
      Thread tTmp = new Thread(() -> {
        jobMethod(a);
      });
      threads.add(tTmp);
      // and shoot!
      tTmp.start();
    }
    

    ??

    ;-)

    【讨论】:

    • 我可以在同一个循环中添加 tTmp.join() 否则它将失去它的效果,因为我在后面还有循环:for (Thread w : works) { w.join(); }
    • 我怀疑(仅当您希望“顺序”处理时!...start() 是“异步代码”,join() 是“阻塞”)..所以对于“同步” - 相同的循环,对于“异步” - 独立循环!
    • 你的意思是对于异步相同的循环,我设置作业和同步(加入)的那个是独立循环!
    • 不,完全不同! :-)) (连接仍将按顺序阻塞/连接,但所有线程都有机会执行/启动;)
    • hu 正在再次阅读您的答案,您的意思是如果我喜欢异步,则连接处于独立循环中,例如,我首先使用 thread.start 有 2 个循环,完成后我有另一个使用线程连接的循环( )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2015-09-30
    • 2017-03-27
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多