当前位置: 首页 > 知识库问答 >
问题:

在循环中创建线程,并等待所有线程在Java中完成

江睿
2023-03-14

我是新来Java的,最近在学校学习多线程,我尝试创建一个小程序,可以将任务分割成一个小的部分,使用循环在多个线程中运行。问题是,在循环之后,我需要将研究结果求和并打印出来,在线程完成之前,循环下的打印运行。而我的同学所做的只是在打印结果之前添加睡眠,但是当线程花费太长时它就不起作用了。在运行其他代码之前,是否需要等待所有的线程在循环中首先完成?

import java.util.concurrent.ExecutorService;

import java.util.concurrent.TimeUnit;

public class threatGenerator {
    static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Scanner sc = new Scanner(System.in);
        System.out.print("Input start: ");
        int start = Integer.parseInt(sc.nextLine());
        System.out.print("Input end: ");
        int end = Integer.parseInt(sc.nextLine());
        
        int threadNumber = (int)Math.ceil((end - start)/100.0) ;

        System.out.println("Running "+threadNumber+" threads.");
       
        for(int i = 0 ;i < threadNumber;i++){
            int temp = start+ 99;
            
            if(temp>end) temp = end;

            String name = String.valueOf(i);
            ThreadDemo thread = new ThreadDemo(name,start,temp);
            thread.start();
            
            start = temp+1;
            
        }
        Thread.sleep(10);
        System.out.println("\nSum of primes = "+count);
        sc.close();
    }

    public static void awaitTerminationAfterShutdown(ExecutorService threadPool) {
        threadPool.shutdown();
        try {
            if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
                threadPool.shutdownNow();
            }
        } catch (InterruptedException ex) {
            threadPool.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
}

class ThreadDemo extends Thread {
    private Thread t;
    private String threadName;
    private int start;
    private int end;
    private int num = 0;

    ThreadDemo( String name,int start,int end) {
        threadName= name;
        this.start = start;
        this.end = end;
    }
    public void run() {
        Prime p = new Prime();

        for(int i = start ; i<=end;i++){
            if(p.checkPrime(i)!=true){
                System.out.print("t"+threadName+"-"+i+" ");
                ++num;
            }
        }
        threatGenerator.count = threatGenerator.count + num;
    }
    
    public void setCount(int count){
        this.num=count;
    }

    public int getCount() {
        return this.num;
    }

    public void start () {
        // System.out.println("Starting " + threadName);
        if (t == null) {
            t = new Thread (this, threadName);
            t.start();
        }
        
    }
    
}

共有1个答案

赏梓
2023-03-14

是不是要等待所有的线程在循环中完成...?

如果更改程序以保留所有thread引用(例如,通过将它们添加到arraylist )中,则可以编写第二个循环,使join()s所有线程。

https://docs.oracle.com/en/Java/javase/12/docs/api/Java.base/Java/lang/thread.html#join()

t.join()等待(即,不返回),直到线程t终止。

 类似资料:
  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

  • 这可能是在类似的背景下问的,但我在搜索了大约20分钟后找不到答案,所以我会问。 我已经编写了一个Python脚本(比如说:scriptA.py)和一个脚本(比如说scriptB.py) 在scriptB中,我想用不同的参数多次调用scriptA,每次运行大约需要一个小时,(这是一个巨大的脚本,做了很多事情……不用担心),我希望能够同时使用所有不同的参数运行scriptA,但我需要等到所有参数都完成

  • 问题内容: 在我的程序执行过程中,启动了多个线程。线程数量取决于用户定义的设置,但是它们都使用不同的变量执行相同的方法。 在某些情况下,需要在执行过程中进行清理,其中一部分是停止所有线程,尽管我不希望它们立即停止,我只是设置了一个变量来检查它们是否终止。问题在于线程停止之前最多可能需要1/2秒。但是,我需要确保所有线程都已停止,然后才能继续进行清理。清理是从另一个线程执行的,因此从技术上讲,我需要

  • 在下面的Haskell代码中,如何强制主线程等待其所有子线程完成。 我无法使用forkFinal,因为在“终止程序”一节中给出了这个链接:(http://hackage.haskell.org/package/base-4.7.0.2/docs/Control-Concurrent.html)。 当使用TMVar时,我得到了想要的结果。但是我想用TVar做这件事。请帮忙。

  • 问题内容: 我正在编写一个具有5个线程的应用程序,这些线程可以同时从Web获取一些信息,并在缓冲区类中填充5个不同的字段。 当所有线程完成其工作时,我需要验证缓冲区数据并将其存储在数据库中。 我该怎么做(当所有线程完成工作时收到警报)? 问题答案: 我采用的方法是使用管理线程池。

  • 我有一个生产者-消费者模式的多线程任务。可能有许多生产者和一个消费者。我使用ArrayBlockingQueue作为共享资源。 Producer类中的run()方法: Consumer类中的run()方法: main()方法: 现在,当队列为空时,我有消费者结束条件。但是可能会有一段时间队列变成空的,但是一些生产者线程仍然在工作。所以我只需要在完成所有生产者线程之后才完成消费者线程(但它们的数量事