下面是我写的一个类,其中的目的是我们从并行运行的主程序创建不同的线程,主线程在所有线程完成执行后恢复执行 . 代码中的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 回答
保留一个你已经启动的线程列表,并且在它们全部启动之后才加入:
为了解释这个区别,我将逐步介绍你提到的主要方法使用
count = 8
和count = 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秒后已经完成
主要完成