轻松学习多线程-04-Guarded Suspension 模式
2018-03-20 20:33
357 查看
Guarded Suspension 模式
Guarded Suspension 模式通过让线程等待保证线程的安全性。实际案例
类信息概览:类名 | 说明 |
---|---|
Main.java | 方法的总入口 |
ClientThread.java | 发送请求的类 |
ServerThread.java | 接受请求的类 |
RequestQueue.java | 依次存放请求的类 |
Request.java | 标识一个请求的类 |
定义
ClientThread.javapackage com.github.houbb.thread.learn.easy.learn.guarded.suspension; import java.util.Random; public class ClientThread extends Thread { private final Random random; private final RequestQueue requestQueue; public ClientThread(RequestQueue requestQueue, final String name, final long seed) { super(name); this.requestQueue = requestQueue; random = new Random(seed); } @Override public void run() { for(int i = 0; i < 10; i++) { Request request = new Request("No. " + i); requestQueue.putRequest(request); System.out.println(Thread.currentThread().getName() + " put " + request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
ServerThread.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension; import java.util.Random; public class ServerThread extends Thread { private final Random random; private final RequestQueue requestQueue; public ServerThread(RequestQueue requestQueue, final String name, final long seed) { super(name); this.requestQueue = requestQueue; random = new Random(seed); } @Override public void run() { for(int i = 0; i < 10; i++) { Request request = requestQueue.getRequest(); System.out.println(Thread.currentThread().getName()+" get "+request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
RequestQueue.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension; import java.util.LinkedList; import java.util.Queue; public class RequestQueue { private Queue<Request> requestQueue = new LinkedList<>(); /** * 获取一个对象 * 1. 如果队列为空,则一直等待。 * @return */ public synchronized Request getRequest() { while(requestQueue.peek() == null) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // Retrieves and removes the head of this queue. return requestQueue.remove(); } /** * 放置一个对象 * @param request */ public synchronized void putRequest(Request request) { requestQueue.add(request); notifyAll(); } }
Request.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension; /** * 请求参数 * @version 1.0.0 * @author bbhou * @since 1.0.0 */ public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Request{" + "name='" + name + '\'' + '}'; } }
测试
Main.javapackage com.github.houbb.thread.learn.easy.learn.guarded.suspension; public class Main { public static void main(String[] args) { RequestQueue requestQueue = new RequestQueue(); new ClientThread(requestQueue, "CLIENT", 10000L).start(); new ServerThread(requestQueue, "SERVER", 20000L).start(); } }
测试结果
CLIENT put Request{name='No. 0'} SERVER get Request{name='No. 0'} CLIENT put Request{name='No. 1'} SERVER get Request{name='No. 1'} CLIENT put Request{name='No. 2'} CLIENT put Request{name='No. 3'} SERVER get Request{name='No. 2'} SERVER get Request{name='No. 3'} CLIENT put Request{name='No. 4'} CLIENT put Request{name='No. 5'} SERVER get Request{name='No. 4'} CLIENT put Request{name='No. 6'} CLIENT put Request{name='No. 7'} SERVER get Request{name='No. 5'} CLIENT put Request{name='No. 8'} SERVER get Request{name='No. 6'} CLIENT put Request{name='No. 9'} SERVER get Request{name='No. 7'} SERVER get Request{name='No. 8'} SERVER get Request{name='No. 9'}
实现方式
UML & Code
UML
UML 图示如下Code
代码地址Guarded Suspension
系列导航
多线程系列导航相关文章推荐
- 轻松学习多线程-03-Immutable 模式
- 多线程学习之六生产消费者模式
- 代理模式【设计模式学习-04】
- 轻松学习Spring IoC容器和Dependency Injection模式
- Java设计模式学习04——原型模式
- 多线程学习04-NSThread创建
- 轻松学习Spring IoC容器和Dependency Injection模式(转)
- 多线程程序设计学习(5)balking模式和timed模式
- Android设计模式学习日记04--单例模式
- 多线程学习之四返回模式
- 设计模式学习04-工厂方法模式
- 关于多线程中单例模式的使用学习笔记
- iOS Programming 学习笔记 - 04 UITableView编辑模式
- 多线程学习12-GCD实现单例模式
- 轻松学习JAVA设计模式
- 多线程学习之路-学习master-worker设计模式
- 轻松学习多线程-01-基础知识
- 多线程学习之一独木桥模式Single Threaded Execution Pattern
- 轻松学习Spring IoC容器和Dependency Injection模式(转)
- 多线程程序设计学习(6)Producer-Consumer模式