線(xiàn)程的創(chuàng )建
創(chuàng )建新執行線(xiàn)程有兩種方法。
方法一種方法是將類(lèi)聲明為 Thread 的子類(lèi)。該子類(lèi)應重寫(xiě) Thread 類(lèi)的 run方法。事實(shí)上類(lèi)Thread本身也實(shí)現了接口Runnable,所以我們可以同過(guò)繼承Thread類(lèi)實(shí)現線(xiàn)程體。
參考:
SellBookThread.java與
CallSellBook.java另一種方法是聲明實(shí)現 Runnable 接口的類(lèi)。該類(lèi)然后實(shí)現 run 方法。
參考:
SellBookRunnable.java與
CallSellBook.java線(xiàn)程的狀態(tài)
線(xiàn)程有四種狀態(tài):創(chuàng )建狀態(tài)(New),可運行狀態(tài)(Runnable),阻塞狀態(tài)(Blocked),死亡狀態(tài)(Dead)。
創(chuàng )建狀態(tài)(New):
當執行完
Thread t1 = new SellBookThread("SaleMan1",bookList);
語(yǔ)句之后,則t1處于創(chuàng )建狀態(tài)(New)。此時(shí)t1并未真正運行。
可運行狀態(tài)(Runnable):
當Thread t1被創(chuàng )建,并執行完
t1.start();
語(yǔ)句之后,t1就處于可運行狀態(tài)(Runnable)。此時(shí),系統為線(xiàn)程t1分配其所需的系統資源。并對t1加以調用(或者根據任務(wù)調度情況準備調用)。
阻塞狀態(tài)(Blocked):
由于以下原因:
1) 調用了sleep()方法;
2)調用了suspend()方法(該方法已不推薦使用);
3) 為等待條件鎖,調用wait()方法等;
4) 輸入輸出,或消息發(fā)生阻塞;
使得線(xiàn)程處于阻塞狀態(tài)(Blocked)。處于該狀態(tài)的線(xiàn)程即使處理器空閑,也不會(huì )得到執行。
死亡狀態(tài)(Dead):
死亡狀態(tài)(Dead)可以為自然死亡(線(xiàn)程運行完畢),或者調用了stop()方法(該方法已不推薦使用)。
線(xiàn)程的優(yōu)先級:
可以通過(guò)Thread類(lèi)的
void setPriority(int newPriority)
方法為線(xiàn)程設置優(yōu)先級。但是不能保證高優(yōu)先級的線(xiàn)程就會(huì )被先運行。
線(xiàn)程組:
可以通過(guò)
ThreadGroup group = newThreadGroup(groupName);
Thread t1 = new Thread(ThreadGroup g,Runnable r1);
Thread t1 = new Thread(ThreadGroup g, Runnable r2);
等方法把多個(gè)線(xiàn)程加到一個(gè)線(xiàn)程組里去,這樣可以通過(guò)ThreadGroup對這些線(xiàn)程進(jìn)行某些統一操作,
例如:group.interrupt();中斷該組所有線(xiàn)程。
線(xiàn)程unchecked異常處理器:
可以通過(guò):
public voidstaticThread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)
方法為所有線(xiàn)程指定一個(gè)unchecked異常處理器,該處理器必須實(shí)現UncaughtExceptionHandler接口。
線(xiàn)程同步:
線(xiàn)程同步指多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)某資源時(shí),采用一系列的機制以保證同時(shí)最多只能一個(gè)線(xiàn)程訪(fǎng)問(wèn)該資源。
線(xiàn)程同步是多線(xiàn)程中必須考慮和解決的問(wèn)題,因為很可能發(fā)生多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)(主要是寫(xiě)操作)同一資源,如果不進(jìn)行線(xiàn)程同步,很可能會(huì )引起數據混亂,造成線(xiàn)程死鎖等問(wèn)題。
使用synchronized同步線(xiàn)程。
在J2SE5.0之前,只能使用synchronized來(lái)同步線(xiàn)程??梢允褂胹ynchronized來(lái)同步代碼塊或者方法。
同步代碼塊例:
synchronized(欲同步的對象obj) {需要同步的代碼塊}可以同步代碼塊。
參考:
SellBookThread.java - private void sellBook(Book book) {
- synchronized (book) {
- ...
- }
- }
private void sellBook(Book book) { synchronized (book) { ... } }該例synchronized (book)表示若多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)時(shí),只讓其中一個(gè)線(xiàn)程最先取得book對象,其它線(xiàn)程則阻塞直到代碼塊執行完畢book對象被釋放后,其它線(xiàn)程才能取得該book對象繼續執行。
很多情況下,可以使用synchronized(this){...}來(lái)同步代碼塊。但需要注意的是,使用this作為同步對象的話(huà),如果同一個(gè)類(lèi)中存在多個(gè)synchronized(this){...}代碼塊,其中任何一個(gè)synchronized(this)代碼塊處于被執行狀態(tài),則其它線(xiàn)程對其他synchronized(this)代碼塊的訪(fǎng)問(wèn)也會(huì )受到阻塞。
同步方法例:
- synchronized private void sellBook(Book book) {
- ...
- }
synchronized private void sellBook(Book book) {...}這種方法其實(shí)相當于
- private void sellBook(Book book) {
- synchronized(this) {
- ...
- }
- }
private void sellBook(Book book) { synchronized(this) { ... }}由于默認采用this作為同步對象,所以當一個(gè)類(lèi)中有多個(gè)synchronized方法時(shí),同樣會(huì )存在以上問(wèn)題:即如果有一個(gè)線(xiàn)程訪(fǎng)問(wèn)其中某個(gè)synchronized方法時(shí),直到該方法執行完畢,其它線(xiàn)程對其它synchronized方法的訪(fǎng)問(wèn)也將受到阻塞。
有關(guān)synchronized詳細說(shuō)明我們將在其它文章中加以說(shuō)明。
使用java.util.concurrent.locks.ReentrantLock和java.util.concurrent.locks.ReentrantReadWriteLock類(lèi)同步線(xiàn)程。
J2SE5.0加入了ReentrantLock和ReentrantReadWriteLock可以對線(xiàn)程進(jìn)行同步,這里舉一個(gè)最簡(jiǎn)單的例子對其加以說(shuō)明:
- class X {
- private final ReentrantLock lock = new ReentrantLock();
-
-
- public void m() {
- lock.lock();
- try {
-
- } finally {
- lock.unlock()
- }
- }
- }
-
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } }}其它J2SE5.0新導入的有關(guān)線(xiàn)程的相關(guān)接口/類(lèi):
java.util.concurrent.Future
Future接口可以保持/取得異步執行的結果值
java.util.concurrent.Callable
類(lèi)似于Runnable接口。但Runnable不能返回值,也不能拋出checked異常
java.util.concurrent.ExecutorService
該接口繼承了Executor接口??梢酝ㄟ^(guò)submit方法把Runnable,Callable對象轉換為Future 形式。
java.util.concurrent.FutureTask
該類(lèi)實(shí)現了Runnable和Future接口。提供異步執行的取消以及異步執行結果的取得等功能。
java.util.concurrent.Executor
執行指定的Runnable對象
java.util.concurrent.Executors
工具類(lèi)。提供靜態(tài)方法可以創(chuàng )建Executor,ExecutorService,Callable等對象??梢酝ㄟ^(guò)newCachedThreadPool()等方法簡(jiǎn)單創(chuàng )建線(xiàn)程池。