小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java線程工具走出錘子敲鐵皮時代。

 philip 2006-06-18


長期以來,我都覺得多線程的使用是重要而又較難掌握的,要用的時候現(xiàn)看,下次用的時候忘記了,又要現(xiàn)看,這可能跟我長期從事的是Application Server中,某種固定架構(gòu)下的編程,平時并不太需要自己管理線程這一事實有比較大的關系。過年的時候,因為著手策劃自己的一個應用程序架構(gòu),對線程的問題多看了幾眼。

在我看來Java api對線程的封裝似乎過于簡潔,或者說過于基礎,太多事情要自己處理。這與Java api其他某些包事無巨細的包辦形成鮮明的對比,每當我使用到線程這一部分,就覺得倒退到了錘子敲鐵皮的時代。當然這增加了靈活性,但確實也增加了使用多線程開發(fā)并發(fā)程序的門檻。

Java api中的三大板斧:synchronized/wait/notify,的確簡單有效。但是在某些情況下,需要更加復雜更加高層次的同步工具。找到了Doug Lea 編寫的一個優(yōu)秀的并發(fā)實用程序開放源碼庫 util.concurrent,它包括互斥、信號量、適于并發(fā)的集合類以及幾個工作隊列實現(xiàn)。

util.concurrent 庫已經(jīng)用于 Java? SDK 1.5 。

有了這個包,多線程特性可以更方便的使用了。我認為,如果這個包實現(xiàn)的足夠好(bug少少,性能高高),將會為我們的編程帶來非常大的方便。加入了這個包,java api 的抽象層次,在各個包之間,才算達到平衡的狀態(tài)。

下面來看看這個包里面具體有些什么樣的好東西。

sync接口:專門負責同步操作,用于替代Java提供的synchronized關鍵字,以實現(xiàn)更加靈活的代碼同步。實現(xiàn)這個接口的類有下面幾個。

Semaphore:信號量。和synchronized類似,提供了acquire()方法允許在設定時間內(nèi)嘗試鎖定信號量,若超時則返回false。

Mutex:和synchronized類似,與之不同的是,synchronized的同步段只能限制在一個方法內(nèi),而Mutex對象可以作為參數(shù)在方法間傳遞,所以可以把同步代碼范圍擴大到跨方法甚至跨對象。

NullSync:一個比較奇怪的東西,其方法的內(nèi)部實現(xiàn)都是空的,可能是作者認為如果你在實際中發(fā)現(xiàn)某段代碼根本可以不用同步,但是又不想過多改動這段代碼,那么就可以用NullSync來替代原來的Sync實例。此外,由于NullSync的方法都是synchronized,所以還是保留了“內(nèi)存壁壘”的特性。

ObservableSync:把sync和observer模式結(jié)合起來,當sync的方法被調(diào)用時,把消息通知給訂閱者,可用于同步性能調(diào)試。

TimeoutSync:可以包在Sync的外層,實現(xiàn)上鎖超時控制的類,具體上鎖的代碼靠構(gòu)造函數(shù)傳入的sync實例來完成,其自身只負責監(jiān)測上鎖操作是否超時,可與SyncSet合用。

Channel接口:代表一種具備同步控制能力的容器,你可以從中存放/讀取對象。不同于api中的Collection接口,可以把Channel看作是連接對象生產(chǎn)者(Producer)和對象消費者(Consumer)之間的一根管道。通過和Sync接口配合,Channel提供了阻塞式的對象存取方法(put/take)以及可設置阻塞等待時間的offer/poll方法。實現(xiàn)Channel接口的類有LinkedQueue,BoundedLinkedQueue,BoundedBuffer,BoundedPriorityQueue,SynchronousChannel,Slot等。

使用Channel我們可以很容易的編寫具備消息隊列功能的代碼,示例如下:

Package org.javaresearch.j2seimproved.thread;

Import EDU.oswego.cs.dl.util.concurrent.*;

public class TestChannel {
final Channel msgQ = new LinkedQueue(); //log信息隊列

public static void main(String[] args) {
TestChannel tc = new TestChannel();
For(int i = 0;i < 10;i ++){
Try{
tc.serve();
Thread.sleep(1000);
}catch(InterruptedException ie){
}
}
}

public void serve() throws InterruptedException {
String status = doService();
//把doService()返回狀態(tài)放入Channel,后臺logger線程自動讀取之
msgQ.put(status);
}

private String doService() {
// Do service here
return "service completed OK! ";
}

public TestChannel() { // start background thread
Runnable logger = new Runnable() {
public void run() {
try {
for (; ; )
System.out.println("Logger: " + msgQ.take());
}
catch (InterruptedException ie) {}
}
};
new Thread(logger).start();
}
}

Excutor/ThreadFactory接口: 把相關的線程創(chuàng)建/回收/維護/調(diào)度等工作封裝起來,而讓調(diào)用者只專心于具體任務的編碼工作(即實現(xiàn)Runnable接口),不必顯式創(chuàng)建Thread類實例就能異步執(zhí)行任務。
同時,Excutor的某些實現(xiàn)類實現(xiàn)了線程的“輕量級”使用,包括線程池,任務隊列等。具體的實現(xiàn)有: PooledExecutor,ThreadedExecutor,QueuedExecutor,F(xiàn)JTaskRunnerGroup等。
下面給出一段代碼,使用PooledExecutor實現(xiàn)一個簡單的多線程服務器。


package org.javaresearch.j2seimproved.thread;
import java.net.*;
import EDU.oswego.cs.dl.util.concurrent.*;

public class TestExecutor {
public static void main(String[] args) {
PooledExecutor pool =
new PooledExecutor(new BoundedBuffer(10), 20);
pool.createThreads(4);
try {
ServerSocket socket = new ServerSocket(9999);
for (; ; ) {
final Socket connection = socket.accept();
pool.execute(new Runnable() {
public void run() {
new Handler().process(connection);
}
});
}
}
catch (Exception e) {} // die
}
static class Handler {
void process(Socket s){
}
}
}

發(fā)表于 2004年02月19日 11:14 AM

評論

# 回復:java線程工具走出錘子敲鐵皮時代。 2004-06-03 4:56 PM mm
Sync

# java線程工具 2004-09-27 2:56 PM Alex Lin
Ping Back來自:blog.csdn.net

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多