第一种
1.请求
package guarded_suspension; public class Request { // 模拟请求内容 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Request(String name) { this.name = name; } }
2.请求队列
package guarded_suspension; import java.util.LinkedList; public class RequestQueue { private LinkedList queue = new LinkedList(); public synchronized Request getRequest() { while (queue.size() == 0) { try { wait(); // 等待,直到有新的request加入 } catch (InterruptedException ex) { } } // 返回request队列中的第一个请求 return (Request) queue.remove(); } public synchronized void addRequest(Request request) { // 加入新的request请求 queue.add(request); // 通知getRequest方法 notifyAll(); } }
3.Server端
package guarded_suspension; public class ServerThread extends Thread { // 请求队列 private RequestQueue requestQueue; public ServerThread(RequestQueue requestQueue, String name) { super(name); this.requestQueue = requestQueue; } public void run() { while (true) { // 得到请求 final Request request = requestQueue.getRequest(); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " handle " + request); } } }
4.Client端
package guarded_suspension; public class ClientThread extends Thread { // 请求队列 private RequestQueue requetQueue; public ClientThread(RequestQueue requestQueue, String name) { super(name); this.requetQueue = requestQueue; } public void run() { for (int i = 0; i < 10; i++) { Request request = new Request("RequestId " + i + " Thread Name " + Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName() + " requests " + request); requetQueue.addRequest(request); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Client Thread Name is " + Thread.currentThread().getName()); } System.out.println(Thread.currentThread().getName() + " request end."); } }
5.测试类
package guarded_suspension; public class Test { public static void main(String[] args) { RequestQueue requestQueue = new RequestQueue(); for (int i = 0; i < 10; i++) { new ServerThread(requestQueue, "ServerThread-" + i).start(); } for (int i = 0; i < 10; i++) { new ClientThread(requestQueue, "ClientThread-" + i).start(); } } }
第二种
有返回值... ...
相关推荐
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...
│ 高并发编程第二阶段38讲、多线程Active Objects设计模式(接受异步消息的主动对象)-上.mp4 │ 高并发编程第二阶段39讲、多线程Active Objects设计模式(接受异步消息的主动对象)-中.mp4 │ 高并发编程第二阶段40...
《Java高并发编程详解:多线程与架构设计》是一本深入探讨Java中多线程编程和并发架构的书籍...通过这本书,读者不仅可以了解到Java多线程的底层机制,还能学会如何在实际项目中运用并发技术,提升系统的性能和稳定性。
│ 高并发编程第二阶段38讲、多线程Active Objects设计模式(接受异步消息的主动对象)-上.mp4 │ 高并发编程第二阶段39讲、多线程Active Objects设计模式(接受异步消息的主动对象)-中.mp4 │ 高并发编程第二阶段40...
Java线程安全是多线程编程中的核心概念,它涉及到在并发环境中如何保证代码的正确性和数据的一致性。在Java中,线程安全主要通过以下几种方式来实现: 1. **同步机制**:Java提供了多种同步机制来保证线程安全,...
- **并发模式**:介绍了如Producer-Consumer、Builder、Guarded Suspension等经典并发模式,并提供了Java实现。 - **并发集合**:详述了JUC(Java Util Concurrency)库,包括ArrayList、LinkedList、HashMap等...
并发编程笔记中的知识点涵盖了保护性暂停模式(Guarded Suspension Design Pattern)的定义、实现与分析,以及在Java中如何通过GuardedObject对象来实现多线程间的结果传递和超时处理。以下是详细的知识点梳理: 1....
- **多线程设计模式**: - **Future**:支持异步处理,通过`FutureTask`实现。 - **Master-Worker**:适用于可以分解的任务,提高并行处理效率。 - **Guarded Suspension**:在没有足够的资源时暂停执行,避免...
保护性暂停模式(Guarded Suspension Design Pattern)是一种在多线程环境下实现线程之间安全地传递信息的模式。这种模式主要解决了在并发编程中如何安全高效地进行线程间通信和数据传递的问题。 该模式的基本概念...
- **Guarded Suspension(受保护的暂停模式)**:当一个线程调用另一个线程的同步方法时,如果该同步方法没有准备好,则该线程将阻塞,直到该同步方法准备好为止。 - **Producer Consumer(生产者消费者模式)**:...
8. **并发编程模式**:如生产者-消费者模式、读写锁模式、双检锁(DCL)模式、工兵(Guarded Suspension)模式等,这些模式在并发编程中有着广泛的应用。 9. **并发异常处理**:在并发编程中,死锁、活锁、饥饿等是...
- 当需要提高多线程环境下的性能时,因为不可变对象可以安全地在多个线程之间共享。 #### 1.4 标记接口(Marker Interface) **使用:** 标记接口是一种特殊的接口类型,它没有任何方法声明。它主要用于表示某种...