`
chxiaowu
  • 浏览: 240947 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA多线程设计模式三 Guarded Suspension Pattern

 
阅读更多

一定要满足的条件  Guard Condition ,警戒条件。

 

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

 

 

 

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();
    }
}

 

 

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 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) {
            }
        }
    }
}

 

 

 

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();
    }
}

 

 

理解为 带条件的同步关键字。 wait / notify

 

 

1、while(!ready){
      wait();
}

ready = true;
notifyAll();

2、while(!ready){
     Thread.yield();
}


ready=true;

 

注:Thread.yield(); 不会解除锁定,所以这句不应该放在同步关键字中。 ready 声明为 volatile

分享到:
评论
1 楼 zerozone2011 2017-01-04  
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Bluce handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Bluce handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Bluce handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Bluce handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Bluce handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Cool handles [Request No.0 ] queue size:0
2017-01-04 17:05:26 Diet handles [Request No.0 ] queue size:0

有问题呀 我就生成一个request,然后三个消费者消费,按说不应该都等待啦吗?可是linkedlist没有清空,getRequest依旧可以拿到数据,而实际打印的时候linkedlist的size确实为空了呀

相关推荐

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

    书中包含Java线程的介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第一章相关线程设计模式的介绍,都举一反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的...

    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

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

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

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

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

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

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

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

    java线程安全总结.pdf

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

    设计模式笔记

    - **Guarded Suspension(受保护的暂停模式)**:当一个线程调用另一个线程的同步方法时,如果该同步方法没有准备好,则该线程将阻塞,直到该同步方法准备好为止。 - **Producer Consumer(生产者消费者模式)**:...

    aqs-并发编程笔记.pdf

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

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

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

    20.9.24aqs-并发编程笔记.pdf

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

    java并发编程源码

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

    concurrent.rar

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

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

    总结来说,这篇文章介绍了一种创新的同步语言多线程代码生成工具,该工具通过一系列精心设计的转换和优化步骤,能够有效地将同步语言程序转化为适合多核处理器的多线程代码。这项工作不仅增强了同步语言在并发编程中...

    高性能java系统实现与调优

    - **多线程设计模式**: - **Future**:支持异步处理,通过`FutureTask`实现。 - **Master-Worker**:适用于可以分解的任务,提高并行处理效率。 - **Guarded Suspension**:在没有足够的资源时暂停执行,避免...

    Java并发安全控制(培训)

    #### 三、线程安全设计 1. **原子性和竞争条件**: - **原子性操作**:如`++`等操作在某些情况下可能不是原子性的,需要通过同步机制来保证。 - **竞争条件**:多个线程同时访问同一个资源时可能会出现的问题。 ...

Global site tag (gtag.js) - Google Analytics