多執行緒設計模式-高併發請求快取模式(Guarded Suspension)
高併發請求快取佇列設計模式
一,什麼是Guarded Suspension模式
如果執行現在的處理會造成問題,就讓執行處理的執行緒等待。這種模式通過讓執行緒等待來保證例項的安全性
二,實現一個簡單的執行緒間通訊的例子
一個執行緒(ClientThread)將請求(Request)的例項傳遞給另外一個執行緒(ServerThread)
Request:執行緒例項
RequestQueue:存放請求(Request)例項的佇列
ClientThread:把執行緒例項放到佇列中
ServerThread:從佇列中取執行緒示例
示例程式
package com.ln.concurrent.chapter9;
/**
* @ProjectName: java-concurrency
* @Package: com.ln.concurrent.chapter9
* @Name:Request
* @Author:linianest
* @CreateTime:2020/3/28 19:29
* @version:1.0
* @Description TODO: Request請求
*/
public class Request {
private final String value;
public Request(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
請求佇列
package com.ln.concurrent.chapter9;
import java.util.LinkedList;
/**
* @ProjectName: java-concurrency
* @Package: com.ln.concurrent.chapter9
* @Name:RequestQueue
* @Author:linianest
* @CreateTime:2020/3/28 19:31
* @version:1.0
* @Description TODO: 請求佇列
*/
public class RequestQueue {
private final LinkedList<Request> queue = new LinkedList<>();
public Request getRequest() {
synchronized (queue) {
while (queue.size() <= 0) {
try {
queue.wait();
} catch (InterruptedException e) {
return null;
}
}
return queue.removeFirst();
}
}
public void putRequest(Request request) {
synchronized (queue) {
queue.addLast(request);
queue.notifyAll();
}
}
}
請求客戶端執行緒
package com.ln.concurrent.chapter9;
import java.util.Random;
/**
* @ProjectName: java-concurrency
* @Package: com.ln.concurrent.chapter9
* @Name:ClientThread
* @Author:linianest
* @CreateTime:2020/3/28 19:55
* @version:1.0
* @Description TODO: 客戶端執行緒
*/
public class ClientThread extends Thread{
private final RequestQueue queue;
private final Random random;
private final String sendValue;
public ClientThread(RequestQueue queue, String sendValue){
this.queue = queue;
this.sendValue = sendValue;
this.random = new Random(System.currentTimeMillis());
}
@Override
public void run() {
for (int i = 0; i < 10 ; i++) {
System.out.println("Client -> Request "+sendValue);
queue.putRequest(new Request(sendValue));
try {
Thread.sleep(random.nextInt(1_000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
服務端處理執行緒
package com.ln.concurrent.chapter9;
import java.util.Random;
/**
* @ProjectName: java-concurrency
* @Package: com.ln.concurrent.chapter9
* @Name:ServerThread
* @Author:linianest
* @CreateTime:2020/3/28 20:03
* @version:1.0
* @Description TODO: 服務端處理執行緒
*/
public class ServerThread extends Thread {
private final RequestQueue queue;
private final Random random;
private volatile boolean closed = false;
public ServerThread(RequestQueue queue) {
this.queue = queue;
this.random = new Random(System.currentTimeMillis());
}
@Override
public void run() {
while (!closed) {
Request request = queue.getRequest();
if (null == request) {
System.out.println("Received the empty request.");
continue;
}
System.out.println("Server -> " + request.getValue());
try {
Thread.sleep(random.nextInt(1_000));
} catch (InterruptedException e) {
return;
}
}
}
public void close() {
this.closed = true;
this.interrupt();
}
}
高併發請求,快取佇列
package com.ln.concurrent.chapter9;
/**
* @ProjectName: java-concurrency
* @Package: com.ln.concurrent.chapter9
* @Name:SuspensionClient
* @Author:linianest
* @CreateTime:2020/3/28 20:20
* @version:1.0
* @Description TODO: 高併發請求,快取佇列
*/
public class SuspensionClient {
public static void main(String[] args) throws InterruptedException {
final RequestQueue queue = new RequestQueue();
new ClientThread(queue, "Alex").start();
ServerThread serverThread = new ServerThread(queue);
serverThread.start();
// serverThread.join();
Thread.sleep(10000);
serverThread.close();
}
}
這種實現了,將高併發請求快取在佇列中,當前面的任務執行緒執行完成後,按照順序執行快取的任務請求,保護伺服器
相關文章
- 多執行緒設計模式之Worker Thread模式執行緒設計模式thread
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- 多執行緒與高併發(二)執行緒安全執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- 多執行緒高併發程式設計(10) -- ConcurrentHashMap原始碼分析執行緒程式設計HashMap原始碼
- ros 多執行緒模式ROS執行緒模式
- 多執行緒Reactor模式執行緒React模式
- Java 多執行緒設計模式之 Single Threades ExecutionJava執行緒設計模式thread
- Java 多執行緒設計模式之基礎概念Java執行緒設計模式
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- 多執行緒高併發程式設計(8) -- Fork/Join原始碼分析執行緒程式設計原始碼
- 多執行緒高併發程式設計(3) -- ReentrantLock原始碼分析AQS執行緒程式設計ReentrantLock原始碼AQS
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- 多執行緒高併發程式設計(9) -- CopyOnWrite寫入時複製執行緒程式設計
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 【多執行緒與高併發】- 淺談volatile執行緒
- Java高併發與多執行緒(一)-----概念Java執行緒
- 【多執行緒與高併發 2】volatile 篇執行緒
- Java多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- JAVA多執行緒併發Java執行緒
- 併發程式設計之:執行緒程式設計執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- JUC之Exchanger-多執行緒與高併發執行緒
- 分散式叢集與多執行緒高併發分散式執行緒
- 常用高併發網路執行緒模型效能優化實現-體驗百萬級高併發執行緒模型設計執行緒模型優化
- C++11併發程式設計:多執行緒std::threadC++程式設計執行緒thread
- 多執行緒高併發程式設計(2) -- 可重入鎖介紹和自定義執行緒程式設計
- nodejs 單執行緒 高併發NodeJS執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 從執行緒到併發程式設計執行緒程式設計
- 併發程式設計與執行緒安全程式設計執行緒
- Java併發程式設計:Java執行緒Java程式設計執行緒
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- 多執行緒與高併發(五)final關鍵字執行緒
- 一文看懂JUC多執行緒及高併發執行緒
- 多執行緒與高併發(三)synchronized關鍵字執行緒synchronized