java多线程之-线程组问题
程序员文章站
2022-05-05 16:35:20
...
(一)程序所描述的问题
(1)布置一个任务searcher;
(2)任务的具体内容就是小睡一会TimeUnit.SECONDS.sleep(value)
;
(3)创建一个线程组,给任务分配10个新的 Thread线程组对象Thread thread =new Thread(threadGroup,searcherTask)
;并运行每个线程thread.start();
,每个线程可以进行休眠TimeUnit.SECONDS.sleep(1);
(4)查看线程组中的消息,返回线程组里面那些处于活动状态的线程threadGroup.activeCount()
,并打印出所有线程的信息threadGroup.list();
(5)遍历线程数组,将线程组中的active拷贝到数组threads中
(6)如果线程组中的10个线程都在活跃,那么主线程就睡眠几秒钟waitFinish(threadGroup);
(7)发出信号,使得所有线程都停止threadGroup.interrupt();
(二)具体代码如下
(1)Main.java 主程序
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
//创建一个线程组,JDK自带的
ThreadGroup threadGroup = new ThreadGroup("Searcher");
Result result = new Result();
//创建一个任务,10个线程
//10个线程都去做searcher中的run方法,中间去睡眠一段时间
Searcher searcherTask =new Searcher(result);
for(int i=0; i<10; i++){
//分配一个新的 Thread对象。
Thread thread =new Thread(threadGroup,searcherTask);
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
System.out.println("====selan0====");
//查看线程组中的消息
//返回线程组里面那些处于活动状态的线程
System.out.printf(" active 线程数量:%d\n",threadGroup.activeCount());
//线程组信息明细
System.out.printf("线程组信息明细\n");
threadGroup.list();
System.out.println("====selan1====");//分隔
//遍历线程数组
Thread[] threads = new Thread[threadGroup.activeCount()];
//将线程组中的active拷贝到数组threads中
threadGroup.enumerate(threads);
for(int i=0; i<threadGroup.activeCount(); i++){
//并输出他们的名字和状态
System.out.printf("Thread %s:%s\n",threads[i].getName(),threads[i].getState());;
}
System.out.println("====selan2====");
//如果线程组中的10个线程都在活跃,那么睡眠
waitFinish(threadGroup);
//发出信号,使得所有线程都停止
threadGroup.interrupt();
}
public static void waitFinish(ThreadGroup threadGroup){
//如果线程组中的10个线程都在活跃,那么主线程就睡眠几秒钟
while(threadGroup.activeCount()>9){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
(2)Sreacher.java任务详情
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class Searcher implements Runnable{
private Result result;
public Searcher(Result result) {
super();
this.result = result;
}
@Override
public void run() {
String name =Thread.currentThread().getName();
System.out.printf("Thread %s:启动\n",name);
try {
doTask();
result.setName(name);
} catch (InterruptedException e) {
System.out.printf("Thread %s:被终端\n",name);
return;
}
System.out.printf("Thread %s:完成\n",name);
}
//相当于一个工作的方法
private void doTask() throws InterruptedException{
//new Date()分配一个时间,getTime()并获取这个时间
Random r= new Random((new Date()).getTime());
//nextDouble()返回下一个伪随机数是double类型的
//0.0和 1.0之间的 double值 0.0分布;*100也就是1-10之间的数完美
int value=(int)(r.nextDouble()*100);
//输出一句话获取这个线程的名字,currentThread()返回对当前正在执行的线程对象的引用。
System.out.printf("Thread %s:%d\n",Thread.currentThread().getName(),value);
//进行休眠
TimeUnit.SECONDS.sleep(value);
}
}
(3)返回结果 Result.java
public class Result {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
部分运行截图
下一篇: 多线程Volatile关键字详解