Java多線程 線程組原理及實(shí)例詳解
線程組

線程組可以批量管理線程和線程組對象。
一級關(guān)聯(lián)
例子如下,建立一級關(guān)聯(lián)。
public class MyThread43 implements Runnable{
public void run()
{
try
{
while (!Thread.currentThread().isInterrupted())
{
System.out.println("ThreadName = " + Thread.currentThread().getName());
Thread.sleep(3000);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
MyThread43 mt0 = new MyThread43();
MyThread43 mt1 = new MyThread43();
ThreadGroup tg = new ThreadGroup("新建線程組1");
Thread t0 = new Thread(tg, mt0);
Thread t1 = new Thread(tg, mt1);
t0.start();
t1.start();
System.out.println("活動的線程數(shù)為:" + tg.activeCount());
System.out.println("線程組的名稱為:" + tg.getName());
}
}
輸出結(jié)果如下
活動的線程數(shù)為:2 線程組的名稱為:新建線程組1 ThreadName = Thread-0 ThreadName = Thread-1 ThreadName = Thread-0 ThreadName = Thread-1 ThreadName = Thread-1 ThreadName = Thread-0 ThreadName = Thread-1 ThreadName = Thread-0 ······
每隔三秒輸出兩個線程名稱,符合預(yù)期。
線程組自動歸組屬性
public class ThreadDomain49 {
public static void main(String[] args) {
System.out.println("A處線程:" + Thread.currentThread().getName() + ", 所屬線程:" + Thread.currentThread().getThreadGroup().getName() +
", 組中有線程組數(shù)量:" + Thread.currentThread().getThreadGroup().activeGroupCount());
ThreadGroup group = new ThreadGroup("新的組");
System.out.println("B處線程:" + Thread.currentThread().getName() + ", 所屬線程:" + Thread.currentThread().getThreadGroup().getName() +
", 組中有線程組數(shù)量:" + Thread.currentThread().getThreadGroup().activeGroupCount());
ThreadGroup[] tg = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()];
Thread.currentThread().getThreadGroup().enumerate(tg);
for (int i = 0; i < tg.length; i++)
System.out.println("第一個線程組名稱為:" + tg[i].getName());
}
}
輸出結(jié)果如下
A處線程:main, 所屬線程:main, 組中有線程組數(shù)量:0 B處線程:main, 所屬線程:main, 組中有線程組數(shù)量:1 第一個線程組名稱為:新的組
沒有指定線程組,則歸屬到當(dāng)前線程所屬的組。
根線程組
public class ThreadDomain50 {
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());
System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());
}
}
運(yùn)行結(jié)果
system Exception in thread "main" java.lang.NullPointerException at com.advance.MultiThread3.MyThread.ThreadDomain50.main(ThreadDomain50.java:14)
當(dāng)前線程的線程組的父線程組是系統(tǒng)線程組;系統(tǒng)線程組的父線程組不存在;系統(tǒng)線程組就是根線程組。
批量停止組內(nèi)線程
請看示例
public class MyThread44 extends Thread{
public MyThread44(ThreadGroup tg, String name)
{
super(tg, name);
}
public void run()
{
System.out.println("ThreadName = " + Thread.currentThread().getName() +
"準(zhǔn)備開始死循環(huán)了");
while (!this.isInterrupted()){}
System.out.println("ThreadName = " + Thread.currentThread().getName() +
"結(jié)束了");
}
public static void main(String[] args) throws InterruptedException {
ThreadGroup tg = new ThreadGroup("我的線程組");
MyThread44 mt = null;
for (int i = 0; i < 3; i++)
{
mt = new MyThread44(tg, "線程" + i);
mt.start();
}
Thread.sleep(5000);
tg.interrupt();
System.out.println("調(diào)用了interrupt()方法");
}
}
輸出結(jié)果如下
ThreadName = 線程0準(zhǔn)備開始死循環(huán)了 ThreadName = 線程1準(zhǔn)備開始死循環(huán)了 ThreadName = 線程2準(zhǔn)備開始死循環(huán)了 調(diào)用了interrupt()方法 ThreadName = 線程0結(jié)束了 ThreadName = 線程2結(jié)束了 ThreadName = 線程1結(jié)束了
可以看到,ThreadGroup的interrupt方法批量中斷線程組的線程。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java面向?qū)ο蠡A(chǔ)之多態(tài)性,抽象類和接口
這篇文章主要介紹了Java面向?qū)ο蠡A(chǔ):多態(tài)性,抽象類和接口,文中代碼可以幫助各位更好的理解學(xué)習(xí),有需求的小伙伴可以參考下2020-05-05
springboot以FTP方式上傳文件到遠(yuǎn)程服務(wù)器
這篇文章主要介紹了springboot以FTP方式上傳文件到遠(yuǎn)程服務(wù)器,需要的朋友可以參考下2019-12-12
圖解Java經(jīng)典算法冒泡排序的原理與實(shí)現(xiàn)
冒泡排序是一種簡單的排序算法,它也是一種穩(wěn)定排序算法。其實(shí)現(xiàn)原理是重復(fù)掃描待排序序列,并比較每一對相鄰的元素,當(dāng)該對元素順序不正確時進(jìn)行交換。一直重復(fù)這個過程,直到?jīng)]有任何兩個相鄰元素可以交換,就表明完成了排序2022-09-09

