国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
JAVA 的多線程淺析

作者:馬光暉

JAVA 語言的來源、及特點(diǎn)

在這個(gè)高速信息的時(shí)代,商家們紛紛把信息、產(chǎn)品做到Internet國(guó)際互連網(wǎng)頁上。再這些不尋常網(wǎng)頁的背后,要屬功能齊全、安全可靠的編程語言,Java是當(dāng)之無愧的。Java是由Sun Microsystem開發(fā)的一種功能強(qiáng)大的新型程序設(shè)計(jì)語言。是與平臺(tái)無關(guān)的編程語言。它是一種簡(jiǎn)單的、面象對(duì)象的、分布式的、解釋的、鍵壯的、安全的、結(jié)構(gòu)的中立的、可移植的、性能很優(yōu)異的、多線程的、動(dòng)態(tài)的、語言。

Java自問世以后,以其編程簡(jiǎn)單、代碼高效、可移植性強(qiáng),很快受到了廣大計(jì)算機(jī)編程人士的青睞。Java語言是Internet上具有革命性的編程語言,它具有強(qiáng)大的動(dòng)畫、多媒體和交互功能,他使World Web進(jìn)入了一個(gè)全新的時(shí)代。Java語言與C++極為類似,可用它來創(chuàng)建安全的、可移植的、多線程的交互式程序。另外用Java開發(fā)出來的程序與平臺(tái)無關(guān),可在多種平臺(tái)上運(yùn)行。后臺(tái)開發(fā),是一種高效、實(shí)用的編程方法。人們?cè)谄聊磺爸荒芸吹嚼鐖D案、計(jì)算的結(jié)果等。實(shí)際上操作系統(tǒng)往往在后臺(tái)來調(diào)度一些事件、管理程序的流向等。例如操作系統(tǒng)中的堆棧,線程間的資源分配與管理,內(nèi)存的創(chuàng)建、訪問、管理等??芍^舉不盛舉。下面就多線程來談一談。

 

JAVA的多線程理論

2.1引入

      Java提供的多線程功能使得在一個(gè)程序里可同時(shí)執(zhí)行多個(gè)小任務(wù)。線程有時(shí)也稱小進(jìn)程是一個(gè)大進(jìn)程里分出來的小的獨(dú)立的進(jìn)程。因?yàn)?/span>Java實(shí)現(xiàn)的多線程技術(shù),所以比C和C++更鍵壯。多線程帶來的更大的好處是更好的交互性能和實(shí)時(shí)控制性能。當(dāng)然實(shí)時(shí)控制性能還取決于系統(tǒng)本身(UNIX,Windows,Macintosh),在開發(fā)難易程度和性能上都比單線程要好。傳統(tǒng)編程環(huán)境通常是單線程的,由于JAVA是多線程的。盡管多線程是強(qiáng)大而靈巧的編程工具,但要用好卻不容易,且有許多陷阱,即使編程老手也難免誤用。為了更好的了解線程,用辦公室工作人員作比喻。辦公室工作人員就象CPU,根據(jù)上級(jí)指示做工作,就象執(zhí)行一個(gè)線程。在單線程環(huán)境中,每個(gè)程序編寫和執(zhí)行的方式是任何時(shí)候程序只考慮一個(gè)處理順序。用我們的比喻,就象辦公室工作人員從頭到尾不受打擾和分心,只安排做一個(gè)工作。當(dāng)然,實(shí)際生活中工作人員很難一次只有一個(gè)任務(wù),更常見的是工作人員要同時(shí)做幾件事。老板將工作交給工作人員,希望工作人員做一這個(gè)工作,再做點(diǎn)那個(gè)工作,等等。如果一個(gè)任務(wù)無法做下去了,比如工作人員等待另一部門的信息,則工作人員將這個(gè)工作放在一邊,轉(zhuǎn)入另一個(gè)工作。一般來說,老板希望工作人員手頭的各個(gè)任務(wù)每一天都有一些進(jìn)展。這樣就引入了多線程的概念。多線程編程環(huán)境與這個(gè)典型的辦公室非常相似,同時(shí)給CPU分配了幾個(gè)任務(wù)或線程。和辦公室人員一樣,計(jì)算機(jī)CPU實(shí)際上不可能同一時(shí)間做幾件事,而是把時(shí)間分配到不同的線程,使每個(gè)線程都有點(diǎn)進(jìn)展。如果一個(gè)線程無法進(jìn)行,比如線程要求的鍵盤輸入尚未取得,則轉(zhuǎn)入另一線程的工作。通常,CPU在線程間的切換非常迅速,使人們感覺到好象所有線程是同時(shí)進(jìn)行的。

              任何處理環(huán)境,無論是單線程還是多線程,都有三個(gè)關(guān)鍵方面。第一個(gè)是CPU,它實(shí)際上進(jìn)行計(jì)算機(jī)活動(dòng);第二個(gè)是執(zhí)行的程序的代碼;第三個(gè)是程序操作的數(shù)據(jù)。

在多線程編程中,每個(gè)線程都用編碼提供線程的行為,用數(shù)據(jù)供給編碼操作。多個(gè)線程可以同時(shí)處理同一編碼和數(shù)據(jù),不同的線程也可能各有不同的編碼和數(shù)據(jù)。事實(shí)上編碼和數(shù)據(jù)部分是相當(dāng)獨(dú)立的,需要時(shí)即可向線程提供。因此經(jīng)常是幾個(gè)線程使用同一編碼和不同的數(shù)據(jù)。這個(gè)思想也可以用辦公室工作人員來比喻。會(huì)計(jì)可能要做一個(gè)部門的帳或幾個(gè)或幾個(gè)部門的帳。任何情況的做帳的任務(wù)是相同的程序代碼,但每個(gè)部門的數(shù)據(jù)是不同的。會(huì)計(jì)可能要做整個(gè)公司的帳,這時(shí)有幾個(gè)任務(wù),但有些數(shù)據(jù)是共享的,因?yàn)楣編ば枰獊碜愿鱾€(gè)部門的數(shù)據(jù)。

多線程編程環(huán)境用方便的模型隱藏CPU在任務(wù)切換間的事實(shí)。模型允許假裝成有多個(gè)可用的CPU。為了建立另一個(gè)任務(wù),編程人員要求另一個(gè)虛擬CPU,指示它開始用某個(gè)數(shù)據(jù)組執(zhí)行某個(gè)程序段。下面我們來建立線程。

       建立線程

JAVA中建立線程并不困難,所需要的三件事:執(zhí)行的代碼、代碼所操作的數(shù)據(jù)和執(zhí)行代碼的虛擬CPU。虛擬CPU包裝在Thread類的實(shí)例中。建立Thread對(duì)象時(shí),必須提供執(zhí)行的代碼和代碼所處理的數(shù)據(jù)。JAVA的面向?qū)ο竽P鸵蟪绦虼a只能寫成類的成員方法。數(shù)據(jù)只能作為方法中的自動(dòng)(或本地)變量或類的成員存在。這些規(guī)則要求為線程提供的代碼和數(shù)據(jù)應(yīng)以類的實(shí)例的形式出現(xiàn)。

Public class SimpleRunnable implemants Runable{

    Private String message;

    Public static void main(String args[]){

       SimpleRunnable r1=new SimpleRunnable(Hello);

       Thread t1=new Thread(r1);

       t1.start();

}

public SimpleRunnable(String message){

this.message=message;

}

public void run(){

    for(;;){

       System.out.println(message);

    }

}

}

線程開始執(zhí)行時(shí),它在public void run()方法中執(zhí)行。這種方法是定義的線程執(zhí)行的起點(diǎn),就象應(yīng)用程序從main()開始、小程序從init()開始一樣。線程操作的本地?cái)?shù)據(jù)是傳入線程的對(duì)象的成員。

首先,main()方法構(gòu)造SimpleRunnable類的實(shí)例。注意,實(shí)例有自己的數(shù)據(jù),這里是一個(gè)String,初始化為Hello.由于實(shí)例r1傳入Thread類構(gòu)造器,這是線程運(yùn)行時(shí)處理的數(shù)據(jù)。執(zhí)行的代碼是實(shí)例方法run()。

2.2 線程的管理

單線程的程序都有一個(gè)main執(zhí)行體,它運(yùn)行一些代碼,當(dāng)程序結(jié)束執(zhí)行后,它正好退出,程序同時(shí)結(jié)束運(yùn)行。在JAVA中我們要得到相同的應(yīng)答,必須稍微進(jìn)行改動(dòng)。只有當(dāng)所有的線程退出后,程序才能結(jié)束。只要有一個(gè)線程一直在運(yùn)行,程序就無法退出。線程包括四個(gè)狀態(tài):new(開始),running(運(yùn)行),wait(等候)和done(結(jié)束)。第一次創(chuàng)建線程時(shí),都位于new狀態(tài),在這個(gè)狀態(tài)下,不能運(yùn)行線程,只能等待。然后,線程或者由方法start開始或者送往done狀態(tài),位于done中的線程已經(jīng)結(jié)束執(zhí)行,這是線程的最后一個(gè)狀態(tài)。一旦線程位于這個(gè)狀態(tài),就不能再次出現(xiàn),而且當(dāng)JAVA虛擬機(jī)中的所有線程都位于done狀態(tài)時(shí),程序就強(qiáng)行中止。當(dāng)前正在執(zhí)行的所有線程都位于running狀態(tài),在程序之間用某種方法把處理器的執(zhí)行時(shí)間分成時(shí)間片,位于running狀態(tài)的每個(gè)線程都是能運(yùn)行的,但在一個(gè)給定的時(shí)間內(nèi),每個(gè)系統(tǒng)處理器只能運(yùn)行一個(gè)線程。與位于running狀態(tài)的線程不同,由于某種原因,可以把已經(jīng)位于waiting狀態(tài)的線程從一組可執(zhí)行線程中刪除。如果線程的執(zhí)行被中斷,就回到waiting狀態(tài)。用多種方法能中斷一個(gè)線程。線程能被掛起,在系統(tǒng)資源上等候,或者被告知進(jìn)入休眠狀態(tài)。該狀態(tài)的線程可以返回到running狀態(tài),也能由方法stop送入done狀態(tài),

方法

描述

有效狀態(tài)

目的狀態(tài)

Start()

開始執(zhí)行一個(gè)線程

New

Running

Stop()

結(jié)束執(zhí)行一個(gè)線程

New或running

Done

Sleep(long)

暫停一段時(shí)間,這個(gè)時(shí)間為給定的毫秒

Running

Wait

Sleep(long,int)

暫停片刻,可以精確到納秒

Running

Wait

Suspend()

掛起執(zhí)行

Running

Wait

Resume()

恢復(fù)執(zhí)行

Wait

Running

Yield()

明確放棄執(zhí)行

Running

Running

2.3線程的調(diào)度

線程運(yùn)行的順序以及從處理器中獲得的時(shí)間數(shù)量主要取決于開發(fā)者,處理器給每個(gè)線程分配一個(gè)時(shí)間片,而且線程的運(yùn)行不能影響整個(gè)系統(tǒng)。處理器線程的系統(tǒng)或者是搶占式的,或者是非搶占式的。搶占式系統(tǒng)在任何給定的時(shí)間內(nèi)將運(yùn)行最高優(yōu)先級(jí)的線程,系統(tǒng)中的所有線程都有自己的優(yōu)先級(jí)。Thread.NORM_PRIORITY是線程的缺省值,Thread類提供了setPriority和getPriority方法來設(shè)置和讀取優(yōu)先權(quán),使用setPriority方法能改變Java虛擬機(jī)中的線程的重要性,它調(diào)用一個(gè)整數(shù),類變量Thread.MIN_PRIORITY和Thread.MAX_PRIORITY決定這個(gè)整數(shù)的有效范圍。Java虛擬機(jī)是搶占式的,它能保證運(yùn)行優(yōu)先級(jí)最高的線程。在JAVA虛擬機(jī)中我們把一個(gè)線程的優(yōu)先級(jí)改為最高,那么他將取代當(dāng)前正在運(yùn)行的線程,除非這個(gè)線程結(jié)束運(yùn)行或者被一條休眠命令放入waiting狀態(tài),否者將一直占用所有的處理器的時(shí)間。如果遇到兩個(gè)優(yōu)先級(jí)相同的線程,操作系統(tǒng)可能影響線程的執(zhí)行順序。而且這個(gè)區(qū)別取決于時(shí)間片(time slicing)的概念。

管理幾個(gè)線程并不是真正的難題,對(duì)于上百個(gè)線程它是怎樣管理的呢?當(dāng)然可以通過循環(huán),來執(zhí)行每一個(gè)線程,但是這顯然是冗長(zhǎng)、乏味。JAVA創(chuàng)建了線程組。線程組是線程的一個(gè)譜系組,每個(gè)組包含的線程數(shù)不受限制,能對(duì)每個(gè)線程命名并能在整個(gè)線程組中執(zhí)行(Suspend)和停止(Stop)這樣的操作。

2.4信號(hào)標(biāo)志:保護(hù)其它共享資源

這種類型的保護(hù)被稱為互斥鎖。某個(gè)時(shí)間只能有一個(gè)線程讀取或修改這個(gè)數(shù)據(jù)值。在對(duì)文件尤其是信息數(shù)據(jù)庫進(jìn)行處理時(shí),讀取的數(shù)據(jù)總是多于寫數(shù)據(jù),根據(jù)這個(gè)情況,可以簡(jiǎn)化程序。下面舉一例,假設(shè)有一個(gè)雇員信息的數(shù)據(jù)庫,其中包括雇員的地址和電話號(hào)碼等信息,有時(shí)要進(jìn)行修改,但要更多的還是讀數(shù)據(jù),因此要盡可能防止數(shù)據(jù)被破壞或任意刪改。我們引入前面互斥鎖的概念,允許一個(gè)讀取鎖(red lock)和寫入鎖(write lock),可根據(jù)需要確定有權(quán)讀取數(shù)據(jù)的人員,而且當(dāng)某人要寫數(shù)據(jù)時(shí),必須有互斥鎖,這就是信號(hào)標(biāo)志的概念。信號(hào)標(biāo)志有兩種狀態(tài),首先是empty()狀態(tài),表示沒有任何線程正在讀或?qū)?,可以接受讀和寫的請(qǐng)求,并且立即提供服務(wù);第二種狀態(tài)是reading()狀態(tài),表示有線程正在從數(shù)據(jù)庫中讀信息,并記錄進(jìn)行讀操作的線程數(shù),當(dāng)它為0時(shí),返回empty狀態(tài),一個(gè)寫請(qǐng)求將導(dǎo)致這個(gè)線程進(jìn)入等待狀態(tài)。

只能從empty狀態(tài)進(jìn)入writing狀態(tài),一旦進(jìn)入writing狀態(tài)后,其它線程都不能寫操作,任何寫或讀請(qǐng)求都必須等到這個(gè)線程完成寫操作為止,而且waiting狀態(tài)中的進(jìn)程也必須一直等到寫操作結(jié)束。完成操作后,返回到empty狀態(tài),發(fā)送一個(gè)通知信號(hào),等待的線程將得到服務(wù)。

下面實(shí)現(xiàn)了這個(gè)信號(hào)標(biāo)志

class Semaphore{

       final static int EMPTY=0;

       final static int READING=1;

       final static int WRITING=2;

       protected int state=EMPTY;

       protected int readCnt=0;

public synchronized void readLock(){

    if(state==EMPTY){

    state=READING;

    }

    else if(state==READING){

    }

    else if(state==WRITING){

       while(state==WRITING){

           try {wait();}

           catch(InterruptedException e){;}

       }

    state=READING;

    }

    readCnt++;

return;

}

public synchronized void writeLock(){

    if(state==EMPTY){

    state=WRITING;

    }

    else{

    while(state!=EMPTY){

       try {wait();}

       catch(InterruptedException e) {;}

    }

    }

}

public synchronized void readUnlock(){

readCnt--;

if(readCnt==0){

    state=EMPTY;

notify();

}

}

public synchronized void writeUnlock(){

state=EMPTY;

notify();

}

}

現(xiàn)在是測(cè)試信號(hào)標(biāo)志的程序:

class Process extends Thread{

String op;

Semaphore sem;

Process(String name,String op,Semaphore sem){

    super(name);

    this.op=op;

    this.sem=sem;

    start();

}

public void run(){

    if(op.compareTo("read")==0){

    System.out.println("Trying to get readLock:"+getName());

    sem.readLock();

    System.out.println("Read op:"+getName());

    try {sleep((int)(Math.random()*50));}

    catch(InterruptedException e){;}

    System.out.println("Unlocking readLock:"+getName());

    sem.readUnlock();

    }

    else if(op.compareTo("write")==0){

    System.out.println("Trying to get writeLock:"+getName());

    sem.writeLock();

    System.out.println("Write op:"+getName());

    try {sleep((int)(Math.random()*50));}

    catch(InterruptedException e){;}

    System.out.println("Unlocking writeLock:"+getName());

    sem.writeUnlock();

    }

    }

}

public class testSem{

    public static void main(String argv[]){

       Semaphore lock = new Semaphore();

       new Process("1","read",lock);

       new Process("2","read",lock);

       new Process("3","write",lock);

       new Process("4","read",lock);

}

}

testSem 類從process類的四個(gè)實(shí)例開始,它是個(gè)線程,用來讀或?qū)懸粋€(gè)共享文

件。Semaphore類保證訪問不會(huì)破壞文件,執(zhí)行程序,輸出結(jié)果如下:

Trying  to  get  readLock:1

Read     op:1

Trying  to  get  readLock:2

Read  op:2

Trying  to  get  writeLock:3

Trying  to  get  readLock:4

Read  op:4

Unlocking  readLock:1

Unlocking  readLock:2

Unlocking  readLock:4

Write  op:3

Unlocking  writeLock:3

從這可看到,

2.5死鎖以及怎樣避免死鎖:

為了防止數(shù)據(jù)項(xiàng)目的并發(fā)訪問,應(yīng)將數(shù)據(jù)項(xiàng)目標(biāo)為專用,只有通過類本身的實(shí)例方法的同步區(qū)訪問。為了進(jìn)入關(guān)鍵區(qū),線程必須取得對(duì)象的鎖。假設(shè)線程要獨(dú)占訪問兩個(gè)不同對(duì)象的數(shù)據(jù),則必須從每個(gè)對(duì)象各取一個(gè)不同的鎖。現(xiàn)在假設(shè)另一個(gè)線程也要獨(dú)占訪問這兩個(gè)對(duì)象,則該進(jìn)程必須得到這兩把鎖之后才能進(jìn)入。由于需要兩把鎖,編程如果不小心就可能出現(xiàn)死鎖。假設(shè)第一個(gè)線程取得對(duì)象A的鎖,準(zhǔn)備取對(duì)象B的鎖,而第二個(gè)線程取得了對(duì)象B的鎖,準(zhǔn)備取對(duì)象A的鎖,兩個(gè)線程都不能進(jìn)入,因?yàn)閮烧叨疾荒茈x開進(jìn)入的同步塊,既兩者都不能放棄目前持有的鎖。避免死鎖要認(rèn)真設(shè)計(jì)。線程因?yàn)槟硞€(gè)先決條件而受阻時(shí),如需要鎖標(biāo)記時(shí),不能讓線程的停止本身禁止條件的變化。如果要取得多個(gè)資源,如兩個(gè)不同對(duì)象的鎖,必須定義取得資源的順序。如果對(duì)象A和B的鎖總是按字母順序取得,則不會(huì)出現(xiàn)前面說道的餓死條件。

 

Java多線程的優(yōu)缺點(diǎn)

 

由于JAVA的多線程功能齊全,各種情況面面具到,它帶來的好處也是顯然易見的。多線程帶來的更大的好處是更好的交互性能和實(shí)時(shí)控制性能。當(dāng)然實(shí)時(shí)控制性能還取決于系統(tǒng)本身(UNIX,Windows,Macintosh 等),在開發(fā)難易程度和性能上都比單線程要好。當(dāng)然一個(gè)好的程序設(shè)計(jì)語言肯定也難免有不足之處。由于多線程還沒有充分利用基本OS的這一功能。這點(diǎn)我在前面已經(jīng)提到,對(duì)于不同的系統(tǒng),上面的程序可能會(huì)出現(xiàn)截然不同的結(jié)果,這使編程者偶會(huì)感到迷惑不解。希望在不久的將來JAVA的多線程能充分利用到操作系統(tǒng),減少對(duì)編程者的困惑。我期待著JAVA會(huì)更好。

 

       參考文獻(xiàn):

作者  Philip Heller  Simon Roberts 

              Peter Seymour  Tom McGinn 

1、JAVA高級(jí)開發(fā)指南   

 

 

本書共分四大部分,第一部分基礎(chǔ)篇,介紹Java環(huán)境、小程序和應(yīng)用程序、構(gòu)件、布置管理器和移植等問題。第二部分高級(jí)問題介紹圖形、線程、動(dòng)畫、文件和流、聯(lián)網(wǎng)、數(shù)據(jù)庫的訪問、分布式對(duì)象和協(xié)議處理器等問題。第三部分新API介紹JDK V1.1的新功能。第四部分附錄介紹了API清單、FAQ等。對(duì)于多線程的部分,介紹什么是線程,詳細(xì)介紹了JAVA中的線程機(jī)制,具體討論了包括Java線程的建立與控制和AWT事件處理器線程的意義,與各種環(huán)境中的線程有關(guān)的思想包括實(shí)際CPU少于線程的平臺(tái)上線程的調(diào)度和線程間的交互作用問題,并舉了大量的實(shí)例。

作者       MICHAELD.THOMAS           PRATIKR.PATEL

                 ALAND.HUDSON                   DONALDA.BALL JR 

2、Java for Internet 編程技術(shù)

 

 

 

本書分為五篇。第一篇介紹Java語言的概念;第二篇介紹Java applete的組成要素,語法、語義、接口等;第三篇介紹Java編程高級(jí)技術(shù);第四篇介紹Java與Internet網(wǎng)絡(luò);第五篇介紹了四個(gè)應(yīng)用程序。對(duì)于高級(jí)線程部分,詳細(xì)介紹了創(chuàng)建線程的過程,及討論了如何共享資源等問題。

五、FAQ

1、             Java下一個(gè)定義?

它是一種簡(jiǎn)單的、面象對(duì)象的、分布式的、解釋的、鍵壯的、安全的、結(jié)構(gòu)的中立的、可移植的、性能很優(yōu)異的、多線程的、動(dòng)態(tài)的、語言。

2、applet是什么?

它是一種可以嵌入到Web主頁內(nèi)的小程序。它是一種強(qiáng)大的、通用的、純粹的、獨(dú)立的、與平臺(tái)無關(guān)的程序設(shè)計(jì)語言。

3、虛擬機(jī)具有哪些功能?

具有許多基本功能,如串操作工具,圖形及接口例程、基本數(shù)據(jù)結(jié)構(gòu)以及數(shù)學(xué)功能。這使它超越了作為放火墻的責(zé)任的要求。

4、wait()和notify()是Thread類的方法嗎?

它們不是Thread類的方法,它們包含在Java.lang.Object類中。

5、         Java中線程構(gòu)成的三要素:

第一個(gè)是CPU,它實(shí)際上進(jìn)行計(jì)算機(jī)活動(dòng);第二個(gè)是執(zhí)行的程序的代碼;第三個(gè)是程序操作的數(shù)據(jù)。

6、         Java中如何建立一個(gè)線程

2.1節(jié)中建立線程。

7、         線程的管理有幾種方法:

2.2節(jié)線程的管理。

8、線程同步通常采取的措施有那些?

監(jiān)控程序:保護(hù)共享變量;

信號(hào)標(biāo)志:保護(hù)其它共享資源;

避免死鎖。

9、Java中的線程組起的作用是什么?

線程組是線程的一個(gè)譜系組,包含的線程數(shù)不受限制能對(duì)每個(gè)線程命名并能在整個(gè)線程組中執(zhí)行掛起(suspend)和停止(stop)的操作。

還用于Java運(yùn)行環(huán)境以及線程間的安全性的處理。

10、用Runnable接口創(chuàng)建線程有什么好處?

它為類定義了一個(gè)標(biāo)準(zhǔn)功能架,Runnable接口指定一個(gè)已經(jīng)實(shí)現(xiàn)了的方法run方法。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java線程總結(jié)[圖]
Thread的run()與start()的區(qū)別
學(xué)習(xí)Java多線程之線程定義、狀態(tài)和屬性
深入淺出:JAVA多線程編程實(shí)戰(zhàn)-基礎(chǔ)篇
多線程的概念
Java 多線程(一) 基礎(chǔ)知識(shí)與概念
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服