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

資訊專欄INFORMATION COLUMN

Java多線程基礎(chǔ)(十)——Work Thread模式

xuweijian / 1143人閱讀

摘要:通道參與者參與者保存請(qǐng)求隊(duì)列,同時(shí)會(huì)預(yù)創(chuàng)建線程。注啟動(dòng)線程是一項(xiàng)繁重的工作,模式預(yù)先創(chuàng)建一批線程,可以重復(fù)使用線程,達(dá)到資源再利用提升性能的目的。

一、定義

Work Thread模式和Thread-Per-Message模式類似,Thread-Per-Message每次都創(chuàng)建一個(gè)新的線程處理請(qǐng)求,而Work Thread模式預(yù)先會(huì)創(chuàng)建一個(gè)線程池(Thread Pool),每次從線程池中取出線程處理請(qǐng)求。

二、模式案例

Request請(qǐng)求類:

public class Request {
    private final String name;
    private final int number;
    private static final Random random = new Random();
    public Request(String name, int number) {
        this.name = name;
        this.number = number;
    }
    public void execute() {
        System.out.println(Thread.currentThread().getName() + " executes " + this);
        try {
            Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {
        }
    }
    public String toString() {
        return "[ Request from " + name + " No." + number + " ]";
    }
}

Client線程類:
Client線程類用來(lái)送出請(qǐng)求:

創(chuàng)建Request實(shí)例

將這個(gè)實(shí)例傳送給Channel類的putRequest方法

public class ClientThread extends Thread {
    private final Channel channel;
    private static final Random random = new Random();
    public ClientThread(String name, Channel channel) {
        super(name);
        this.channel = channel;
    }
    public void run() {
        try {
            for (int i = 0; true; i++) {
                Request request = new Request(getName(), i);
                channel.putRequest(request);
                Thread.sleep(random.nextInt(1000));
            }
        } catch (InterruptedException e) {
        }
    }
}

Worker線程類:
WorkerThread類表示工人線程,工人線程可以執(zhí)行以下動(dòng)作:

從Channel實(shí)例取出Request實(shí)例

調(diào)用Request實(shí)例的execute方法

public class WorkerThread extends Thread {
    private final Channel channel;
    public WorkerThread(String name, Channel channel) {
        super(name);
        this.channel = channel;
    }
    public void run() {
        while (true) {
            Request request = channel.takeRequest();
            request.execute();
        }
    }
}

Channel類:

/**
 *Channel類可用來(lái)接受、傳送工作請(qǐng)求,并保存工人線程。
 */
public class Channel {
    private static final int MAX_REQUEST = 100; // 最大請(qǐng)求數(shù)
    private final Request[] requestQueue;         // 請(qǐng)求隊(duì)列
    private int tail;
    private int head;
    private int count;
    private final WorkerThread[] threadPool;
?
    public Channel(int threads) {
        this.requestQueue = new Request[MAX_REQUEST];
        this.head = 0;
        this.tail = 0;
        this.count = 0;
?
        threadPool = new WorkerThread[threads];
        for (int i = 0; i < threadPool.length; i++) {
            threadPool[i] = new WorkerThread("Worker-" + i, this);
        }
    }
    public void startWorkers() {
        for (int i = 0; i < threadPool.length; i++) {
            threadPool[i].start();
        }
    }
    public synchronized void putRequest(Request request) {
        while (count >= requestQueue.length) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        requestQueue[tail] = request;
        tail = (tail + 1) % requestQueue.length;
        count++;
        notifyAll();
    }
    public synchronized Request takeRequest() {
        while (count <= 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        Request request = requestQueue[head];
        head = (head + 1) % requestQueue.length;
        count--;
        notifyAll();
        return request;
    }
}

執(zhí)行:

public class Main {
    public static void main(String[] args) {
        Channel channel = new Channel(5);
        channel.startWorkers();
        new ClientThread("Alice", channel).start();
        new ClientThread("Bobby", channel).start();
        new ClientThread("Chris", channel).start();
    }
}
三、模式講解

Work Thread模式的角色如下:

Client(委托人)參與者

Client參與者會(huì)創(chuàng)建請(qǐng)求(Request),然后傳送給Channel參與者。

Channel(通道)參與者

Channel參與者保存Request請(qǐng)求隊(duì)列,同時(shí)會(huì)預(yù)創(chuàng)建Worker線程。

Worker(工人)參與者

Worker參與者會(huì)從Channel獲取Request。

Request(請(qǐng)求)參與者

Worker參與者會(huì)從Channel獲取Request。

注:?jiǎn)?dòng)線程是一項(xiàng)繁重的工作,Worker Thread模式預(yù)先創(chuàng)建一批線程,可以重復(fù)使用線程,達(dá)到資源再利用、提升性能的目的。

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

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

相關(guān)文章

  • 2017 Android 面試題 [ 基礎(chǔ)與細(xì)節(jié) ]

    摘要:操作完成后,服務(wù)會(huì)自行停止運(yùn)行。創(chuàng)建工作隊(duì)列,用于將逐一傳遞給實(shí)現(xiàn),這樣您就永遠(yuǎn)不必?fù)?dān)心多線程問(wèn)題。是的消息機(jī)制,集中解決線程間通信問(wèn)題。 2017 Android 面試題 [ 基礎(chǔ)與細(xì)節(jié) ] 感謝@chuyao拋出的這些問(wèn)題,平時(shí)業(yè)務(wù)代碼寫多了,很多基礎(chǔ)的東西變得含糊不清了,這次裸辭出來(lái)找工作確實(shí)沒(méi)有之前順利,順便求上海Android開發(fā)的坑。我自己整理了些答案,不對(duì)或者不妥的地方請(qǐng)...

    sydMobile 評(píng)論0 收藏0
  • Java線程線程的創(chuàng)建、中斷、狀態(tài)與屬性

    摘要:中斷線程當(dāng)線程的方法方法體執(zhí)行完畢自然終止或在方法中出現(xiàn)沒(méi)有捕獲的異常時(shí)意外終止,線程將終止。如果被中斷線程被阻塞,就無(wú)法檢測(cè)中斷狀態(tài),就會(huì)產(chǎn)生異常。 多進(jìn)程與多線程的本質(zhì)區(qū)別在于:每個(gè)進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)。如果需要執(zhí)行一個(gè)比較耗時(shí)的任務(wù),應(yīng)該使用獨(dú)立的線程。 可以通過(guò)實(shí)現(xiàn)Runnable接口或繼承Thread類來(lái)創(chuàng)建獨(dú)立的線程。 1) 實(shí)現(xiàn)Ruannable接口...

    liangdas 評(píng)論0 收藏0
  • ()java線程之CountDownLatch

    摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言有一個(gè)同步助手可以讓一個(gè)或一些線程等待直到另外一些線程執(zhí)行完一些操作這就是理論在初始化的時(shí)候需要一個(gè)參數(shù)調(diào)用的線程會(huì)一直等待直到其他線程調(diào)用使清空為通常所有等待中的線程會(huì) 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    陳江龍 評(píng)論0 收藏0
  • 并發(fā)基礎(chǔ)

    摘要:關(guān)于,這個(gè)方法只會(huì)喚醒一個(gè)線程,并且不允許指定喚醒哪個(gè)線程,這是可能會(huì)發(fā)生死鎖的。使用不可變對(duì)象降低了垃圾回收所產(chǎn)生的額外開銷,同時(shí)也可以減少一些為了維護(hù)在并發(fā)中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發(fā)的一些基礎(chǔ)過(guò)了一遍,發(fā)現(xiàn)仍然還是有很多不清楚的地方,主要是因?yàn)槠匠](méi)有機(jī)會(huì)實(shí)際應(yīng)用吧,理論知識(shí)要有,實(shí)踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...

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

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

0條評(píng)論

xuweijian

|高級(jí)講師

TA的文章

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