国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一起學(xué)并發(fā)編程 - 守護(hù)線程

junnplus / 3296人閱讀

摘要:的作用是為其他線程的運(yùn)行提供服務(wù),比如說(shuō)線程。在某些平臺(tái)上,指定一個(gè)較高的參數(shù)值可能使線程在拋出之前達(dá)到較大的遞歸深度。參數(shù)的值與最大遞歸深度和并發(fā)程度之間的關(guān)系細(xì)節(jié)與平臺(tái)有關(guān)。

今天研究了下Java線程基礎(chǔ)知識(shí),發(fā)現(xiàn)以前太多知識(shí)知識(shí)略略帶過(guò)了,比較說(shuō)Java的線程機(jī)制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護(hù)線程),以及構(gòu)造器中的stackSize.....

守護(hù)線程

估計(jì)學(xué)過(guò)Unix開發(fā)但是沒(méi)有細(xì)致學(xué)習(xí)Java的同學(xué)們會(huì)疑惑了,操作系統(tǒng)里面是沒(méi)有所謂的守護(hù)線程的概念,只有守護(hù)進(jìn)程一說(shuō),但是Java語(yǔ)言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺(tái)把操作系統(tǒng)的底層給屏蔽起來(lái),所以它可以在它自己的虛擬的平臺(tái)里面構(gòu)造出對(duì)自己有利的機(jī)制,而語(yǔ)言或者說(shuō)平臺(tái)的設(shè)計(jì)者多多少少是受到Unix思想的影響,而守護(hù)線程機(jī)制又是對(duì)JVM這樣的平臺(tái)湊合,于是守護(hù)線程應(yīng)運(yùn)而生。

Daemon的作用是為其他線程的運(yùn)行提供服務(wù),比如說(shuō)GC線程。其實(shí)User Thread線程和Daemon Thread守護(hù)線程本質(zhì)上來(lái)說(shuō)去沒(méi)啥區(qū)別的,唯一的區(qū)別之處就在虛擬機(jī)的離開:如果User Thread全部撤離,那么Daemon Thread也就沒(méi)啥線程好服務(wù)的了,所以虛擬機(jī)也就退出了。

守護(hù)線程并非虛擬機(jī)內(nèi)部可以提供,用戶也可以自行的設(shè)定守護(hù)線程,方法:setDaemon(boolean on) 但是有幾點(diǎn)需要注意:

thread.setDaemon(true)必須在thread.start()之前設(shè)置,否則會(huì)跑出一個(gè)IllegalThreadStateException異常,因?yàn)槟悴荒馨颜谶\(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程。(備注:這點(diǎn)與守護(hù)進(jìn)程有著明顯的區(qū)別,守護(hù)進(jìn)程是創(chuàng)建后,讓進(jìn)程擺脫原會(huì)話的控制+讓進(jìn)程擺脫原進(jìn)程組的控制+讓進(jìn)程擺脫原控制終端的控制;所以說(shuō)寄托于虛擬機(jī)的語(yǔ)言機(jī)制跟系統(tǒng)級(jí)語(yǔ)言有著本質(zhì)上面的區(qū)別)

public final void setDaemon(boolean on) {
    checkAccess();
    if (isAlive()) {//如果處于運(yùn)行狀態(tài),拋出異常
        throw new IllegalThreadStateException();
    }
    daemon = on;
}

Daemon線程中產(chǎn)生的新線程也是Daemon的。(這一點(diǎn)又是有著本質(zhì)的區(qū)別了:守護(hù)進(jìn)程fork()出來(lái)的子進(jìn)程不再是守護(hù)進(jìn)程,盡管它把父進(jìn)程的進(jìn)程相關(guān)信息復(fù)制過(guò)去了,但是子進(jìn)程的進(jìn)程的父進(jìn)程不是init進(jìn)程,所謂的守護(hù)進(jìn)程本質(zhì)上說(shuō)就是父進(jìn)程掛掉,init收養(yǎng)

不是所有的應(yīng)用都可以分配給Daemon線程來(lái)進(jìn)行服務(wù),比如讀寫操作或者計(jì)算邏輯。因?yàn)樵?b>Daemon Thread還沒(méi)來(lái)的及進(jìn)行操作時(shí),虛擬機(jī)可能已經(jīng)退出了。

Thread thread = new Thread(() -> {
    Thread innerThread = new Thread(() -> {
        try {
            for (int i = 1; i < 10; i++) {
                Thread.sleep(1_000);
                System.out.println("守護(hù)線程 " + i);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    innerThread.setDaemon(true);
    innerThread.start();
    try {
        for (int i = 1; i < 6; i++) {
            Thread.sleep(1_000);
            System.out.println("常規(guī)線程 " + i);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});
thread.start();
日志分析
常規(guī)線程 1
守護(hù)線程 1
守護(hù)線程 2
常規(guī)線程 2
守護(hù)線程 3
常規(guī)線程 3
守護(hù)線程 4
常規(guī)線程 4
守護(hù)線程 5
常規(guī)線程 5

從上面的日志中可以看到,如果將innerThread設(shè)置成守護(hù)模式,那么待當(dāng)前主線程完成處理退出后,守護(hù)線程也會(huì)隨著銷毀

JRE判斷程序是否執(zhí)行結(jié)束的標(biāo)準(zhǔn)是所有的前臺(tái)執(zhí)線程行完畢了,而不管后臺(tái)線程的狀態(tài),因此,在使用后臺(tái)線程候一定要注意這個(gè)問(wèn)題。

那么daemon Thread實(shí)際應(yīng)用在那里呢?舉個(gè)例子,Web服務(wù)器中的Servlet,容器啟動(dòng)時(shí)后臺(tái)初始化一個(gè)服務(wù)線程,即調(diào)度線程,負(fù)責(zé)處理http請(qǐng)求,然后每個(gè)請(qǐng)求過(guò)來(lái)調(diào)度線程線程池中取出一個(gè)工作者線程來(lái)處理該請(qǐng)求,從而實(shí)現(xiàn)并發(fā)控制的目的。

線程函數(shù)

在學(xué)習(xí)Thread的時(shí)候,常見寫法就是RunnableThreadName,所以這里重點(diǎn)講解ThreadGroup以及stackSize的作用

public Thread(); 
public Thread(Runnable target); 
public Thread(String name); 
public Thread(Runnable target, String name); 
public Thread(ThreadGroup group, Runnable target); 
public Thread(ThreadGroup group, String name); 
public Thread(ThreadGroup group, Runnable target, String name); 
public Thread(ThreadGroup group, Runnable target, String name, long stackSize); 

第一種是實(shí)例化一個(gè)無(wú)參構(gòu)造函數(shù),ThreadNameGroupName為系統(tǒng)默認(rèn)

第二種是實(shí)現(xiàn)了Runnable接口的類的實(shí)例,Thread類也實(shí)現(xiàn)了Runnable接口,因此,從Thread類繼承的類的實(shí)例也可以作為target傳入這個(gè)構(gòu)造方法。

第三種是可以自定義ThreadName

第五種是可以指定該線程屬于哪個(gè)ThreadGroup(線程組)

第八種是可以指定堆棧大小(比如壓棧大小),這個(gè)值一般是CPU頁(yè)面的整數(shù)倍,如x86的頁(yè)面大小是4KB.在x86平臺(tái)下,默認(rèn)的線程棧大小是12KB.

ThreadName,可以通過(guò)創(chuàng)建Thread實(shí)例后調(diào)用,setName方法設(shè)置。默認(rèn)線程名:Thread-N,N是線程建立的順序,是一個(gè)不重復(fù)的正整數(shù),它的來(lái)源基于Thread.nextThreadNum()

/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}

stackSize是一種具有平臺(tái)依賴性的參數(shù),它能指定堆棧的大小。 在某些平臺(tái)上,指定一個(gè)較高的 stackSize 參數(shù)值可能使線程在拋出 StackOverflowError 之前達(dá)到較大的遞歸深度。stackSize 參數(shù)的值與最大遞歸深度和并發(fā)程度之間的關(guān)系細(xì)節(jié)與平臺(tái)有關(guān)。在某些平臺(tái)上,stackSize 參數(shù)的值無(wú)論如何不會(huì)起任何作用。作為建議,可以讓虛擬機(jī)自由處理 stackSize 參數(shù)。

ThreadGroup group = new ThreadGroup("battcn-group");
Thread t1 = new Thread(() -> System.out.println("hello my name"s" + Thread.currentThread().getName() + " group name"s" + Thread.currentThread().getThreadGroup().getName()));
Thread t2 = new Thread(() -> System.out.println("hello my name"s" + Thread.currentThread().getName() + " group name"s" + Thread.currentThread().getThreadGroup().getName()), "thread-battcn2");
Thread t3 = new Thread(() -> System.out.println("hello my name"s" + Thread.currentThread().getName() + " group name"s" + Thread.currentThread().getThreadGroup().getName()), "thread-battcn3");
t1.start();
t2.start();
t3.start();
group.enumerate(new Thread[]{t2, t3});

以下是上部代碼片段的日志輸出,可以看到指定ThreadNameThreadGroup以及不指定的的區(qū)別

hello my name"s Thread-0  group name"smain
hello my name"s thread-battcn2  group name"smain
hello my name"s thread-battcn3  group name"smain

警告 如果對(duì)stackSize 有興趣的可以試試下面代碼,不過(guò)慎重,有可能吧你電腦內(nèi)存跑完....

for (int i = 0; i < Integer.MAX_VALUE; i++) {
    new Thread(group, new Runnable() {
        @Override
        public void run() {
            try {
                add(1);
            } catch (Error error) {
                System.out.println(count);
                error.printStackTrace();
            }
        }
        private void add(int i) {
            count++;
            add(i + 1);
        }
    }, "thread-battcn-4",1 << 24).start();
}
- 說(shuō)點(diǎn)什么

微信公眾號(hào):battcn(歡迎調(diào)戲)

全文代碼:https://git.oschina.net/battcn/battcn-concurent

個(gè)人QQ:1837307557

battcn開源群(適合新手):3916196

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70510.html

相關(guān)文章

  • 一起學(xué)并發(fā)編程 - 優(yōu)雅關(guān)閉

    摘要:文本將介紹兩種可以優(yōu)雅的終止線程的方式第一種在多線程模式中有一種叫兩步終止的模式可以優(yōu)雅的終止線程,這種模式采用了兩個(gè)步驟來(lái)終止線程,所以叫兩步終止模式。 Java中原來(lái)在Thread中提供了stop()方法來(lái)終止線程,但這個(gè)方法是不安全的,所以一般不建議使用。文本將介紹兩種可以優(yōu)雅的終止線程的方式... 第一種 在JAVA《Java多線程模式》中有一種叫Two-Phase Term...

    曹金海 評(píng)論0 收藏0
  • Thread源碼剖析

    摘要:現(xiàn)在已經(jīng)沒(méi)有強(qiáng)制線程終止的方法了由于方法可以讓一個(gè)線程終止掉另一個(gè)線程被終止的線程會(huì)立即釋放鎖,這可能會(huì)讓對(duì)象處于不一致的狀態(tài)。 前言 昨天已經(jīng)寫了: 多線程三分鐘就可以入個(gè)門了! 如果沒(méi)看的同學(xué)建議先去閱讀一遍哦~ 在寫文章之前通讀了一遍《Java 核心技術(shù) 卷一》的并發(fā)章節(jié)和《Java并發(fā)編程實(shí)戰(zhàn)》前面的部分,回顧了一下以前寫過(guò)的筆記。從今天開始進(jìn)入多線程的知識(shí)點(diǎn)咯~ 我其實(shí)也是相...

    HtmlCssJs 評(píng)論0 收藏0
  • 一起學(xué)并發(fā)編程 - 線程Join分析

    摘要:當(dāng)時(shí),會(huì)進(jìn)入循環(huán),系統(tǒng)會(huì)判斷主線程是否處于活躍狀態(tài),如果處于活躍狀態(tài),主線程就會(huì)不停的等待。 由于前段時(shí)間比較忙,線程這快學(xué)習(xí)停滯了,只能利用周日的時(shí)間來(lái)寫寫博客了,多線程Join方法的作用就是把指定的線程加入到當(dāng)前線程,讓主線程等待子線程結(jié)束之后才能繼續(xù)運(yùn)行,從而完成同步操作 介紹 join() 的作用:讓主線程等待子線程結(jié)束之后才能繼續(xù)運(yùn)行,首先先來(lái)看下以采集為案例的代碼,統(tǒng)計(jì)采...

    happen 評(píng)論0 收藏0
  • 一起學(xué)并發(fā)編程 - 處理異常中止的線程

    摘要:在之前,不能為線程單獨(dú)設(shè)置或指定一個(gè)默認(rèn)的,為了設(shè)置,需要繼承并覆寫方法。幸運(yùn)的是后線程提供了一個(gè)方法,用來(lái)捕獲并處理因線程中拋出的未知異常,以避免程序終止。 在單線程的開發(fā)過(guò)程中,通常采用try-catch的方式進(jìn)行異常捕獲,但是這種方式在多線程環(huán)境中會(huì)顯得無(wú)能為力,而且還有可能導(dǎo)致一些問(wèn)題的出現(xiàn),比如發(fā)生異常的時(shí)候不能及時(shí)回收系統(tǒng)資源,或者無(wú)法及時(shí)關(guān)閉當(dāng)前的連接... 概述 Ja...

    zacklee 評(píng)論0 收藏0
  • 一起學(xué)并發(fā)編程 - sleep與wait的差異

    摘要:一般差異簡(jiǎn)單來(lái)說(shuō),是一個(gè)用于線程同步的實(shí)例方法。暫停當(dāng)前線程,不釋放任何鎖。用來(lái)線程間通信,使擁有該對(duì)象鎖的線程等待直到指定時(shí)間或。執(zhí)行對(duì)該對(duì)象加的同步代碼塊。 在JAVA的學(xué)習(xí)中,不少人會(huì)把sleep和wait搞混,認(rèn)為都是做線程的等待,下面主要介紹下這倆者是什么,及了解它們之間的差異和相似之處。 一般差異 簡(jiǎn)單來(lái)說(shuō),wait()是一個(gè)用于線程同步的實(shí)例方法。因?yàn)槎x在java.l...

    noONE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<