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

資訊專欄INFORMATION COLUMN

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

xuweijian / 1148人閱讀

摘要:通道參與者參與者保存請求隊列,同時會預創建線程。注啟動線程是一項繁重的工作,模式預先創建一批線程,可以重復使用線程,達到資源再利用提升性能的目的。

一、定義

Work Thread模式和Thread-Per-Message模式類似,Thread-Per-Message每次都創建一個新的線程處理請求,而Work Thread模式預先會創建一個線程池(Thread Pool),每次從線程池中取出線程處理請求。

二、模式案例

Request請求類:

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線程類用來送出請求:

創建Request實例

將這個實例傳送給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類表示工人線程,工人線程可以執行以下動作:

從Channel實例取出Request實例

調用Request實例的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類可用來接受、傳送工作請求,并保存工人線程。
 */
public class Channel {
    private static final int MAX_REQUEST = 100; // 最大請求數
    private final Request[] requestQueue;         // 請求隊列
    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;
    }
}

執行:

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參與者會創建請求(Request),然后傳送給Channel參與者。

Channel(通道)參與者

Channel參與者保存Request請求隊列,同時會預創建Worker線程。

Worker(工人)參與者

Worker參與者會從Channel獲取Request。

Request(請求)參與者

Worker參與者會從Channel獲取Request。

注:啟動線程是一項繁重的工作,Worker Thread模式預先創建一批線程,可以重復使用線程,達到資源再利用、提升性能的目的。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71510.html

相關文章

  • 2017 Android 面試題 [ 基礎與細節 ]

    摘要:操作完成后,服務會自行停止運行。創建工作隊列,用于將逐一傳遞給實現,這樣您就永遠不必擔心多線程問題。是的消息機制,集中解決線程間通信問題。 2017 Android 面試題 [ 基礎與細節 ] 感謝@chuyao拋出的這些問題,平時業務代碼寫多了,很多基礎的東西變得含糊不清了,這次裸辭出來找工作確實沒有之前順利,順便求上海Android開發的坑。我自己整理了些答案,不對或者不妥的地方請...

    sydMobile 評論0 收藏0
  • Java線程線程的創建、中斷、狀態與屬性

    摘要:中斷線程當線程的方法方法體執行完畢自然終止或在方法中出現沒有捕獲的異常時意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態,就會產生異常。 多進程與多線程的本質區別在于:每個進程擁有自己的一整套變量,而線程則共享數據。如果需要執行一個比較耗時的任務,應該使用獨立的線程。 可以通過實現Runnable接口或繼承Thread類來創建獨立的線程。 1) 實現Ruannable接口...

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

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言有一個同步助手可以讓一個或一些線程等待直到另外一些線程執行完一些操作這就是理論在初始化的時候需要一個參數調用的線程會一直等待直到其他線程調用使清空為通常所有等待中的線程會 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    陳江龍 評論0 收藏0
  • 并發基礎

    摘要:關于,這個方法只會喚醒一個線程,并且不允許指定喚醒哪個線程,這是可能會發生死鎖的。使用不可變對象降低了垃圾回收所產生的額外開銷,同時也可以減少一些為了維護在并發中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發的一些基礎過了一遍,發現仍然還是有很多不清楚的地方,主要是因為平常沒有機會實際應用吧,理論知識要有,實踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...

    Warren 評論0 收藏0

發表評論

0條評論

xuweijian

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<