我是新来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();
}
}
}
是不是要等待所有的线程在循环中完成...?
如果更改程序以保留所有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()方法: 现在,当队列为空时,我有消费者结束条件。但是可能会有一段时间队列变成空的,但是一些生产者线程仍然在工作。所以我只需要在完成所有生产者线程之后才完成消费者线程(但它们的数量事