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

来源:互联网 发布:苹果6快速关闭蜂窝数据 编辑:程序博客网 时间:2024/06/05 14:09

线程组

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

 

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


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

实现一个线程


public class ThreadGroupTest implements Runnable{@Overridepublic 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");//parentThreadGroup 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 stubsuper(g,name);//实现继承线程才能调用 使用接口不能实现}@Overridepublic 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();}}


执行结果








原创粉丝点击