`

Java多线程模式之Guarded Suspension Pattern

阅读更多

Guarded Suspension Pattern:保护暂停模式


 设计方法
  1。施加条件加以防卫
  2。区分等待和不等待的情况
  3。执行wait等待条件的变化


 参与者
  GuardedObject:被防卫的对象,有2个方法
   guardedMethod方法
    满足警戒条件时,马上执行
    不满足警戒条件时,等待
   stateChangingMethod方法
    更改警戒条件

import java.util.Random;

public class ClientThread extends Thread {
    private Random random;
    private RequestQueue requestQueue;
    public ClientThread(RequestQueue requestQueue, String name, long seed) {
        super(name);
        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) {
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        RequestQueue requestQueue = new RequestQueue();
        new ClientThread(requestQueue, "Alice", 3141592L).start();
        new ServerThread(requestQueue, "Bobby", 6535897L).start();
    }
}

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 + " ]";
    }
}


import java.util.LinkedList;

public class RequestQueue {
    private final LinkedList queue = new LinkedList();
    public synchronized Request getRequest() {
        while (queue.size() <= 0) {
            try {                                   
                wait();
            } catch (InterruptedException e) {      
            }                                       
        }                                           
        return (Request)queue.removeFirst();
    }
    public synchronized void putRequest(Request request) {
        queue.addLast(request);
        notifyAll();
    }
}

import java.util.Random;

public class ServerThread extends Thread {
    private Random random;
    private RequestQueue requestQueue;
    public ServerThread(RequestQueue requestQueue, String name, long seed) {
        super(name);
        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) {
            }
        }
    }
}

 

1. 将while改成if条件的问题

2.synchronized的范围只有wait

3.try..catch放在while 的外面

4.以Thread.sleep代替wait

    

分享到:
评论

相关推荐

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

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

    java多线程设计模式 (PDF中文版, 附源码)

    目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献

    Java多线程详解

    Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段38讲、多线程Active Objects设计模式(接受异步消息的主动对象)-上.mp4 │ 高并发编程第二阶段39讲、多线程Active Objects设计模式(接受异步消息的主动对象)-中.mp4 │ 高并发编程第二阶段40...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    从监控任务的生命周期管理到单线程执行模式,从读写锁分离到不可变对象设计,再到`Future`和`Guarded Suspension`模式,这些模式能够帮助读者构建出既高效又易于维护的并发系统。每个模式都结合了实际的代码实例和...

    java线程安全总结.pdf

    8. **Guarded Suspension 模式**:这是一种设计模式,通常使用`wait()`和`notify()`方法来协调线程间的执行顺序,确保特定条件满足时线程才能继续执行。 9. **Double-Check Locking(双重检查锁定)**:这是一种...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段38讲、多线程Active Objects设计模式(接受异步消息的主动对象)-上.mp4 │ 高并发编程第二阶段39讲、多线程Active Objects设计模式(接受异步消息的主动对象)-中.mp4 │ 高并发编程第二阶段40...

    aqs-并发编程笔记.pdf

    并发编程笔记中的知识点涵盖了保护性暂停模式(Guarded Suspension Design Pattern)的定义、实现与分析,以及在Java中如何通过GuardedObject对象来实现多线程间的结果传递和超时处理。以下是详细的知识点梳理: 1....

    20.9.24aqs-并发编程笔记.pdf

    保护性暂停模式(Guarded Suspension Design Pattern)是一种在多线程环境下实现线程之间安全地传递信息的模式。这种模式主要解决了在并发编程中如何安全高效地进行线程间通信和数据传递的问题。 该模式的基本概念...

    java并发编程经典书籍(英文版)

    - **并发模式**:介绍了如Producer-Consumer、Builder、Guarded Suspension等经典并发模式,并提供了Java实现。 - **并发集合**:详述了JUC(Java Util Concurrency)库,包括ArrayList、LinkedList、HashMap等...

    设计模式.pdf_学习模式必备

    - **Guarded Suspension**:保护性暂停模式,允许线程等待条件满足后再继续执行。 - **Producer-Consumer**:生产者-消费者模式,通过队列来协调生产者和消费者的执行。 - **Worker Thread**:工作线程模式,使用...

    concurrent.rar

    8. **并发编程模式**:如生产者-消费者模式、读写锁模式、双检锁(DCL)模式、工兵(Guarded Suspension)模式等,这些模式在并发编程中有着广泛的应用。 9. **并发异常处理**:在并发编程中,死锁、活锁、饥饿等是...

    java并发编程源码

    《Java并发编程源码》是深入理解Java多线程编程技术的重要参考资料,它包含了实际案例和源代码,有助于开发者在实践中提升并发编程能力。这里主要围绕"并发"和"源码"这两个关键标签,详细讲解Java并发编程的核心知识...

    一种同步语言多线程代码自动生成工具.pdf

    《一种同步语言多线程代码自动生成工具》这篇文章主要探讨了一种新的技术,该技术能够自动为同步语言生成多线程代码,以适应现代安全关键系统对于计算性能的需求。随着多核处理器在安全关键领域的广泛应用,如何有效...

    高性能java系统实现与调优

    - **Guarded Suspension**:在没有足够的资源时暂停执行,避免资源浪费。 - **不变模式**:通过不可变对象减少锁的竞争。 - **生产者-消费者**:通过共享缓冲区协调多个线程的工作。 - **JDK并发框架与优化**: ...

    36种最新设计模式整理

    28. **守卫条件模式\(Guarded Suspension\)**:等待某个条件满足时再继续执行,常用于多线程的同步。 29. **生产者消费者模式\(Producer Consumer\)**:一个生产者和多个消费者之间的资源分配问题,通常用信号量...

    Java并发安全控制(培训)

    - **单例模式**:单例对象在多线程环境中只允许有一个实例,因此需要保证线程安全。 2. **检查再运行**:即“Check-Then-Act”模式,先检查条件是否满足,然后根据结果执行相应操作。这种模式通常需要与锁配合使用...

    aqs-并发编程(2)笔记.pdf

    在并发编程中,保护性暂停模式(Guarded Suspension Design Pattern)是一种常用的同步机制,用于线程间的协作。该模式允许一个线程等待另一个线程的特定操作完成,然后继续执行。在该模式中,线程间共享的某个对象...

    java的一本好教材

    32. **监控区域(Guarded region)**:在多线程编程中,监控区域是可能抛出异常或需要同步控制的代码段。 33. **堆(Heap)**:Java堆是程序中动态分配内存的区域,用于存储对象实例。 34. **标识符(Identifiers...

Global site tag (gtag.js) - Google Analytics