线程学习(一)---线程组

线程组

可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示:

 

线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织


线程组关联 (子父类关联/一级关联)

实现一个线程


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();
	}

}


执行结果








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值