写在前面的话:假设一种情景,假设你在家里换衣服,这个时候有顺风快递员在门外敲门,你会说等一下,换完衣服你去开门。假设你换衣服是一个线程,顺风快递员把东西送到你的手机是另一个线程,很明显后者线程要目的达到需要前者线程的执行完的条件,这个“保护暂停模式”就是应这样的需求而生。
下面是实例程序:
涉及类及作用介绍:
1,Request:用来表示请求的类。
2,RequestQueue:依次存放请求以待使用的类。
3,ClientRequest:送出请求的类。
4,ServerThread:接收请求的类。
5,Main:操作测试类。
类Request:
package GuardedSuspensionPattern;
/*
*该类用来表示请求
*/
public class Request {
private final String name;
public Request(String name){
this.name = name;
}
public String getName(){
return name;
}
public String toString(){
return "[Request:" + name + "]";
}
}
类RequestQueue:
package GuardedSuspensionPattern;
import java.util.LinkedList;
/*
*请求队列类,有放入请求方法,拿出请求方法,注意都是synchronized的。
*放入的方法没有限制,取出的方法就要先判断有没有请求了,如果没有请求就一直等到有请求。
*/
public class RequestQueue {
private final LinkedList<Request> queue = new LinkedList<Request>();
//取出请求的方法
public synchronized Request getRequest(){
while(queue.size() <= 0){
try {
wait();//一旦请求队列中没有请求,持有RequestQueue实例的线程放入到RequestQueue实例的线程等待区(一旦进入到该区就释放了之前的锁)
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return queue.removeFirst();//拿出队列的第一个请求并返回该请求
}
//放入请求的方法,一旦放入请求,就唤醒所有RequestQueue实例线程等待区的所有等待线程
public synchronized void putRequest(Request request){
queue.addLast(request);//请新的请求放入到队列的最后
notifyAll();//唤醒所有等待的线程
}
}
类:ClientThread
package GuardedSuspensionPattern;
import java.util.Random;
/*
* 该线程类主要负责生产一千个请求放进请求队列中,供处理线程处理
*/
public class ClientThread extends Thread{
private Random random;
private RequestQueue requestQueue;
public ClientThread(RequestQueue requestQueue,String name,long seed){
this.requestQueue = requestQueue;
this.random = new Random(seed);
}
public void run(){
for(int i=0; i<10000; i++){
Request request = new Request("NO:" + i);
System.out.println(Thread.currentThread().getName() + "requests: " + request);
requestQueue.putRequest(request);
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
类ServerThread:
package GuardedSuspensionPattern;
import java.util.Random;
/*&
* 该线程主要带请求队列中拿出一千个请求来处理,如果请求队列中没有请求,就一直等到
* 有请求为止。
*/
public class ServerThread extends Thread{
private Random random;
private RequestQueue requestQueue;
public ServerThread(RequestQueue requestQueue,String name,long seed){
this.requestQueue = requestQueue;
this.random = new Random(seed);
}
public void run(){
for(int i = 0; i < 10000; i++){
Request request = requestQueue.getRequest();
System.out.println(Thread.currentThread().getName() + "handles:" + request);
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
类Main
package GuardedSuspensionPattern;
public class Main {
public static void main(String[] args) {
//定义请求队列实例,注意该实例就是共享资源
RequestQueue requestQueue = new RequestQueue();
//开启“产生1000个请求的实例”线程
new ClientThread(requestQueue,"Supan1",3141592L).start();
//开始“处理1000个请求的实例“线程
new ServerThread(requestQueue, "Supan2", 6535897L).start();
}
}
运行结果:
Thread-0requests: [Request:NO:0]
Thread-1handles:[Request:NO:0]
Thread-0requests: [Request:NO:1]
Thread-0requests: [Request:NO:2]
Thread-1handles:[Request:NO:1]
Thread-1handles:[Request:NO:2]
Thread-0requests: [Request:NO:3]
Thread-1handles:[Request:NO:3]
Thread-0requests: [Request:NO:4]
Thread-1handles:[Request:NO:4]
Thread-0requests: [Request:NO:5]
Thread-0requests: [Request:NO:6]
Thread-1handles:[Request:NO:5]
Thread-1handles:[Request:NO:6]
Thread-0requests: [Request:NO:7]
Thread-1handles:[Request:NO:7]
Thread-0requests: [Request:NO:8]
Thread-1handles:[Request:NO:8]
Thread-0requests: [Request:NO:9]
Thread-1handles:[Request:NO:9]
Thread-0requests: [Request:NO:10]
Thread-0requests: [Request:NO:11]
Thread-1handles:[Request:NO:10]
Thread-1handles:[Request:NO:11]
Thread-0requests: [Request:NO:12]
Thread-1handles:[Request:NO:12]
Thread-0requests: [Request:NO:13]
Thread-1handles:[Request:NO:13]
Thread-0requests: [Request:NO:14]
Thread-1handles:[Request:NO:14]
Thread-0requests: [Request:NO:15]
Thread-1handles:[Request:NO:15]
Thread-0requests: [Request:NO:16]
Thread-1handles:[Request:NO:16]
Thread-0requests: [Request:NO:17]
Thread-1handles:[Request:NO:17]
Thread-0requests: [Request:NO:18]
Thread-1handles:[Request:NO:18]
Thread-0requests: [Request:NO:19]
Thread-1handles:[Request:NO:19]
分享到:
相关推荐
Java 多线程-Socket 编程 Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口...
Java多线程-多功能演示系统,连接MySQL数据库利用多线程实现信息交流,为教师提供教学服务,便于教师整理教学资料,整合所需知识内容,更好的为学生提供生动形象的理解方式,加强教师与学生之间的互动沟通。
Java 线程保护性暂停(wait,notify 实现) 本文将详细讲解 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现。在 Java 中,线程之间的通信是一个非常重要的课题,而保护性暂停机制正是解决线程之间通信...
java - juc - 多线程 - 学习 -思维导图
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
"Java多线程-知识点梳理和总结-超详细-面试知识点" Java多线程是Java编程语言中最基本也是最重要的概念之一。多线程编程可以提高程序的执行效率、改善用户体验和提高系统的可扩展性。但是,多线程编程也存在一些...
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...
Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点...Java多线程与
Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...
Java 多线程主题1- Java 多线程启动线程2- Java 多线程Volatile – 基本线程通信3- Java 多线程同步4- Java 多线程锁对象5- Java 多线程线程池6- Java 多线程倒计时闩锁7- Java 多线程生产者-消费者8- Java 多线程...
JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
Java线程亲和性(Thread Affinity)是一个高级并发编程概念,主要涉及到操作系统调度和硬件资源的优化。在多核处理器系统中,线程亲和性允许开发者指定某个线程应该运行在哪个特定的处理器核心上,从而提高性能、...
Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与...
记录自己学习《图解Java多线程设计模式》这本书的全部过程 本书上传的所有代码都是可以运行的,在此附上本书源码地址: 在此向本书作者和译者表示感谢 运行环境 Eclipse版本:Oxygen.2 Release (4.7.2) JDK版本:jdk...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...
基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java...