首页 文章

关于并行运行线程并在之后返回

提问于
浏览
0

下面是我写的一个类,其中的目的是我们从并行运行的主程序创建不同的线程,主线程在所有线程完成执行后恢复执行 . 代码中的t.join将下一个线程连接到第一个线程 . 假设有2个线程,随机数生成器生成8和9作为整数,则主线程在17秒后恢复 . 目的是并行创建线程,使主线程在第9秒后恢复(第一个线程在前8秒完全运行,然后第二个线程在接下来的1秒内完成执行) . 是否可以通过更改以下代码来创建此类代码?

我通过使用静态变量解决了这个问题,静态变量在执行后由每个线程递增,当线程计数达到某个阈值时,我们停止执行 . 但还有其他方法吗?

import java.util.Random;


public class ThreadsPlay {

public static void main(String[] args) {

    try
    {
        for(int i=3;i<12;i=i+3)
        {
            Thread t=new Thread(){

                Random r=new Random();
                int count=r.nextInt(10);

                public void run()
                {
                    try
                    {
                        System.out.println("Thread+count="+count);
                        Thread.sleep(count*1000);

                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }

                }

            };
            t.start();
            t.join();
        }


    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}

1 回答

  • 1

    保留一个你已经启动的线程列表,并且在它们全部启动之后才加入:

    List<Thread> threads = new ArrayList<Thread>();
    
    for(int i=3;i<12;i=i+3)
    {
        Thread t=new Thread()
        {
            Random r=new Random();
            int count=r.nextInt(10);
    
            public void run()
            {
                try
                {
                    System.out.println("Thread+count="+count);
                    Thread.sleep(count*1000);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        threads.add(t);
    }
    
    // now wait for all threads to finish
    for (Thread t : threads) {
        t.join();
    }
    

    为了解释这个区别,我将逐步介绍你提到的主要方法使用 count = 8count = 9 旋转两个线程的情况 .

    Joining in first for loop (your code) - 17 seconds:

    • main方法启动并输入 for

    • main用 count=8 开始第一个线程

    • 主要调用 join 并在线程工作时阻塞8秒

    • 第一个线程完成,主要重新输入 for 并使用 count=9 启动第二个线程

    • 主要调用 join 并在线程工作时阻塞9秒

    • 第二个线程完成,主要完成

    Joining in second for loop - 9 seconds:

    • main方法首先启动并进入 for

    • main用 count=8 启动第一个线程

    • main重新进入 for 并用 count=9 开始第二个线程
      首先 for 完成后

    • ,两个线程关闭并运行

    • main进入第二个 for 并在第一个线程上调用 join
      两个线程都工作时

    • 主块8秒

    • 第一个线程结束,主要重新进入第二个 for 并在第二个线程上调用 join

    • 主块1秒,因为9秒线程一直在工作

    • 第二个线程完成,主要完成

    现在你可能会说,如果第一个线程有 count=9 而第二个线程有 count=8 会发生什么?加入第二个for循环时, order does not matter, it will always be 9 seconds

    • main进入第二个 for 并在第一个线程上调用 join
      两个线程都工作时

    • 主块9秒
      当主要等待第一个线程完成时,

    • 第二个线程结束

    • 第一个线程完成,主要重新进入第二个 for 并在第二个线程上调用 join

    • 主要块为0秒,因为第二个线程一直在工作并且在8秒后已经完成

    • 主要完成

相关问题