线程学习(一)---线程组
程序员文章站
2022-05-05 16:34:56
...
线程组
可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示:
线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。
线程组关联 (子父类关联/一级关联)
实现一个线程
public class ThreadGroupTest implements Runnable{
@Override
public void run() {
try {
while(!Thread.currentThread().isInterrupted())
{
System.out.println("Thread name:"+Thread.currentThread().getName());
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO: handle exception
}
}}
PS:线程的Interrupt() 表示中断线程 他是实现线程阻塞的方法之一 (stop,sleep...)
Thread.currentThread().isInterrupted() boolean值 判断线程是否中断 中断的话为true 反之false
Thread(3000);当前正在执行的线程睡眠3s,sleep不会释放锁和系统资源
main函数创建线程组
public static void main(String args[]){
ThreadGroup g1=new ThreadGroup("group_1");//parent
ThreadGroup g2=new ThreadGroup(g1, "group_2");//son 属于上述线程组 符合文章开头的图片对应关系
ThreadGroupTest tg1=new ThreadGroupTest();
ThreadGroupTest tg2=new ThreadGroupTest();
Thread t=new Thread(g1,tg1);
Thread t1=new Thread(g2,tg1);
Thread t2 =new Thread(g2,tg2);
t.start();
t1.start();
t2.start();
System.out.println("当前线程组为"+Thread.currentThread().getThreadGroup().getName());//系统线程 根类
System.out.println("线程组名称"+g1.getName());
System.out.println("线程活动数"+g1.activeCount());//组内线程和组内线程组线程 总和
System.out.println("线程组名称"+g2.getName());
System.out.println("线程活动数"+g2.activeCount());
System.out.println("线程组父类组"+g2.getParent().getName());
}
执行结果
根据下面每次的线程执行顺序可以看出多线程同时执行的话造成的线程安全性问题,也就是竞争cpu资源的不确定性,后话
依靠线程组进行线程的批量停止
public class ThreadInterruptTest extends Thread{
public ThreadInterruptTest(ThreadGroup g,String name) {
// TODO Auto-generated constructor stub
super(g,name);//实现继承线程才能调用 使用接口不能实现
}
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
System.out.println(Thread.currentThread().getName()+"is ready");
while(!Thread.currentThread().isInterrupted()){
//执行死循环
}
//执行interrupt()后 线程中断停止
System.out.println(Thread.currentThread().getName()+"ended");
}
main函数
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ThreadGroup tg=new ThreadGroup("g1");
ThreadInterruptTest t=null;
for(int i=1;i<5;i++){
t=new ThreadInterruptTest(tg, "Thread"+i);
t.start();
}
Thread.sleep(3000);//睡眠3s 保证thread 都为ready状态 否则会抛出 InterruptedException 异常
System.out.println("线程组调用interrupt方法");
tg.interrupt();
}
}
执行结果
上一篇: 【备战秋招Day 8】经典面试题29-32及在线编程题22-24答案
下一篇: 线程组