`
Supanccy2013
  • 浏览: 220591 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程-GuardedSuspension保护暂停模式

阅读更多
      写在前面的话:假设一种情景,假设你在家里换衣服,这个时候有顺风快递员在门外敲门,你会说等一下,换完衣服你去开门。假设你换衣服是一个线程,顺风快递员把东西送到你的手机是另一个线程,很明显后者线程要目的达到需要前者线程的执行完的条件,这个“保护暂停模式”就是应这样的需求而生。

下面是实例程序:
涉及类及作用介绍:
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 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口...

    Java多线程-多功能演示系统.zip

    Java多线程-多功能演示系统,连接MySQL数据库利用多线程实现信息交流,为教师提供教学服务,便于教师整理教学资料,整合所需知识内容,更好的为学生提供生动形象的理解方式,加强教师与学生之间的互动沟通。

    java线程-保护性暂停(wait,notify实现).docx

    Java 线程保护性暂停(wait,notify 实现) 本文将详细讲解 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现。在 Java 中,线程之间的通信是一个非常重要的课题,而保护性暂停机制正是解决线程之间通信...

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    "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京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...

    Java多线程与线程安全实践-基于Http协议的断点续传

    Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点续传 Java多线程与线程安全实践-基于Http协议的断点...Java多线程与

    Java多线程-Thread类的常用结构及线程优先级

    Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...

    JAVA多线程与线程安全实践-基于Http协议的断点续传.rar

    JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多线程与线程安全实践-基于Http协议的断点续传 JAVA多...

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与线程安全实践-基于Http协议的断点续传Java多线程与...

    java8源码-GraphicMultiThreadDesignPattern:图解Java多线程设计模式

    记录自己学习《图解Java多线程设计模式》这本书的全部过程 本书上传的所有代码都是可以运行的,在此附上本书源码地址: 在此向本书作者和译者表示感谢 运行环境 Eclipse版本:Oxygen.2 Release (4.7.2) JDK版本:jdk...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...

    基于java的开发源码-超简单Java多线程填表源码.zip

    基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java...

    Java多线程编程实战指南 设计模式篇.rar

    本实战指南将深入探讨如何在Java多线程环境中有效地运用设计模式。 一、Java多线程基础 1. 线程创建:Java提供了两种创建线程的方式,一是通过实现Runnable接口,二是继承Thread类。两者各有优缺点,Runnable适合...

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

Global site tag (gtag.js) - Google Analytics