欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中線程組ThreadGroup與線程池的區(qū)別及示例

 更新時間:2023年05月09日 09:20:54   作者:九月木碼  
這篇文章主要介紹了Java中線程組與線程池的區(qū)別及示例,ThreadGroup是用來管理一組線程的,可以控制線程的執(zhí)行,查看線程的執(zhí)行狀態(tài)等操作,方便對于一組線程的統(tǒng)一管理,需要的朋友可以參考下

線程組概念理解

在java的多線程處理中有線程組ThreadGroup的概念,ThreadGroup是為了方便線程管理出現(xiàn)了,可以統(tǒng)一設定線程組的一些屬性,比如setDaemon,設置未處理異常的處理方法,設置統(tǒng)一的安全策略等等;也可以通過線程組方便的獲得線程的一些信息。

每一個ThreadGroup都可以包含一組的子線程和一組子線程組,在一個進程中線程組是以樹形的方式存在,通常情況下根線程組是system線程組。system線程組下是main線程組,默認情況下第一級應用自己的線程組是通過main線程組創(chuàng)建出來的。

我們可以通過下面代碼片段看下一個簡單的java application中線程組的情況:

package cn.outofmemory.concurrent;
public class ThreadGroupDemo {
	public static void main(String[] args) {
		printGroupInfo(Thread.currentThread());
		Thread appThread = new Thread(new Runnable(){
			@Override
			public void run() {
				for (int i=0;i<5;i++) {
					System.out.println("do loop " + i);
				}
			}
		});
		appThread.setName("appThread");
		appThread.start();
		printGroupInfo(appThread);
	}
	static void printGroupInfo(Thread t) {
		ThreadGroup group = t.getThreadGroup();
		System.out.println("thread " + t.getName() + " group name is " 
				+ group.getName()+ " max priority is " + group.getMaxPriority()
				+ " thread count is " + group.activeCount());
		ThreadGroup parent=group;
		do {
			ThreadGroup current = parent;
			parent = parent.getParent();
			if (parent == null) {
				break;
			}
			System.out.println(current.getName() + "'s parent is " + parent.getName());
		} while (true);
		System.out.println("--------------------------");
	}
}

這段代碼打印結果如下:

thread main group name is main max priority is 10 thread count is 1
main's parent is system
--------------------------
thread appThread group name is main max priority is 10 thread count is 2
main's parent is system
--------------------------
do loop 0
do loop 1
do loop 2
do loop 3
do loop 4

在創(chuàng)建線程時可以通過構造函數(shù)指定其所在的線程組,如下代碼:

ThreadGroup group=new ThreadGroup("worker");
Thread thread=new Thread(group,"the first thread of group");

通常情況下我們創(chuàng)建線程時可能不設置線程組,這時候創(chuàng)建的線程會和創(chuàng)建該線程的線程在一個組里面。

線程組實踐

下面通過實例演示如何使用ThreadGroup,該實例中設定了線程組的Daemon屬性,設置了線程組內(nèi)線程的最大優(yōu)先級,通過繼承ThreadGroup的方式,重寫了該線程組對于未處理異常的處理邏輯。

請看下面代碼:

package cn.outofmemory.concurrent;
import java.net.SocketException;
public class ThreadGroupDemo2 {
	public static void main(String[] args) {
		ThreadGroup spiderGroup = new SpiderThreadGroup("spiderGroup");
		//可以統(tǒng)一設定線程是否為守護線程
		spiderGroup.setDaemon(true);
		//可以設置線程組內(nèi)的最大優(yōu)先級
		spiderGroup.setMaxPriority(Thread.NORM_PRIORITY);
		//初始化線程
		Thread spiderThread = new Thread(spiderGroup, new Runnable() {
			@Override
			public void run() {
				throw new RuntimeException(new SocketException());
			}
		});
		//啟動線程
		spiderThread.start();
	}
	/**
	 * 此類從ThreadGroup類繼承重寫了其uncaughtException方法,對于SocketException進行了特殊處理
	 * @author outofmemory.cn
	 *
	 */
	static class SpiderThreadGroup extends ThreadGroup {
		public SpiderThreadGroup(String name) {
			super(name);
		}
		public void uncaughtException(Thread t, Throwable e) {
			if (e.getCause() instanceof SocketException) {
				System.out.println("socket exception should be process");
			} else {
				super.uncaughtException(t, e);
			}
		}
	}
}

上面的實例代碼會輸出如下內(nèi)容:

socket exception should be process

說明未處理異常已經(jīng)被統(tǒng)一處理了。

下面我們通過另外一個示例演示如何通過線程組,方便的獲得應用中一共有多少個活動線程,并打印這些活動線程的名字。

package cn.outofmemory.concurrent;
public class ThreadDemo3 {
	public static void main(String[] args) {
		ThreadGroup g = Thread.currentThread().getThreadGroup();
		while (g != null) {
			ThreadGroup temp = g.getParent();
			if (temp == null) {
				break;
			}
			g = temp;
		}
		//現(xiàn)在g就是跟線程組
		System.out.println("active count is " + g.activeCount());
		Thread[] all = new Thread[g.activeCount()];
		g.enumerate(all);
		for (Thread t : all) {
			System.out.println(t.getName());
		}
	}
}

你不妨猜猜這個小程序的輸出結果,按理說我只有一個main方法,沒有任何自定義線程,那么會輸出幾個線程呢?

下面是輸出結果:

active count is 5
Reference Handler
Finalizer
Signal Dispatcher
Attach Listener
main

一共有5個線程,這5個線程除了main是我們自己代碼run所在的線程,其他都是虛擬機啟動的線程。是不是出乎你的意外了?

線程組和線程池的區(qū)別

線程組和線程池是兩個不同的概念,他們的作用完全不同,線程組是為了方便線程的管理,線程池是為了管理線程的生命周期,復用線程,減少創(chuàng)建銷毀線程的開銷。

在構建線程池時,ThreadPoolExcutor的構造方法中,生成線程工廠的參數(shù)ThreadFactory接口的實現(xiàn)類DefaultThreadFactory中有個屬性,ThreadGroup

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
public class DefaultThreadFactory implements ThreadFactory {
    private static final AtomicInteger poolId = new AtomicInteger();
    private final AtomicInteger nextId = new AtomicInteger();
    private final String prefix;
    private final boolean daemon;
    private final int priority;
    protected final ThreadGroup threadGroup;
    ......
}

到此這篇關于Java中線程組ThreadGroup與線程池的區(qū)別及示例的文章就介紹到這了,更多相關Java 線程組ThreadGroup內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)一個簡單的Web服務器實例解析

    java實現(xiàn)一個簡單的Web服務器實例解析

    這篇文章主要介紹了java實現(xiàn)一個簡單的Web服務器實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Redis有效時間設置以及時間過期處理操作

    Redis有效時間設置以及時間過期處理操作

    這篇文章主要介紹了Redis有效時間設置以及時間過期處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 解決在IDEA下使用JUnit的問題(解決過程)

    解決在IDEA下使用JUnit的問題(解決過程)

    很多朋友跟小編反饋在IDEA下使用JUnit進行實例測試的時候出現(xiàn)很多奇葩問題,今天小編通過本文給大家分享idea使用JUnit出現(xiàn)問題及解決過程,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • SSH框架網(wǎng)上商城項目第29戰(zhàn)之使用JsChart技術顯示商品銷售報表

    SSH框架網(wǎng)上商城項目第29戰(zhàn)之使用JsChart技術顯示商品銷售報表

    這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第29戰(zhàn)之使用JsChart技術顯示商品銷售報表,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring容器注冊組件實現(xiàn)過程解析

    Spring容器注冊組件實現(xiàn)過程解析

    這篇文章主要介紹了Spring容器注冊組件實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java實戰(zhàn)小技巧之數(shù)組與list互轉(zhuǎn)

    Java實戰(zhàn)小技巧之數(shù)組與list互轉(zhuǎn)

    在Java中,經(jīng)常遇到需要List與數(shù)組互相轉(zhuǎn)換的場景,下面這篇文章主要給大家介紹了關于Java實戰(zhàn)小技巧之數(shù)組與list互轉(zhuǎn)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • 用Java進行zip文件壓縮與解壓縮

    用Java進行zip文件壓縮與解壓縮

    這篇文章主要介紹了用Java進行zip文件壓縮與解壓縮的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java如何調(diào)用Matlab程序

    Java如何調(diào)用Matlab程序

    這篇文章主要介紹了Java如何調(diào)用Matlab程序的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring boot2X負載均衡和反向代理實現(xiàn)過程解析

    Spring boot2X負載均衡和反向代理實現(xiàn)過程解析

    這篇文章主要介紹了Spring boot2X負載均衡和反向代理實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java程序中方法的用法重載和遞歸

    Java程序中方法的用法重載和遞歸

    Java語言中的“方法”在其他語言當中也可能被稱為“函數(shù)”(Function)。對于一些復雜的代碼邏輯,如果希望重復使用這些代碼,并且做到“隨時任意使用”,那么就可以將這些代碼放在一個大括號“{}”當中,并且起一個名字。使用代碼的時候,直接找到名字調(diào)用即可
    2021-10-10

最新評論