多线程设计模式(一)

DelayQueue的使用设计

我们谈一下实际的场景吧。我们在开发中,有如下场景

a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。

今天我们举个简单的例子来设计一下DelayQueue的用法,这种具有设计意义的代码,非常的通用,只要思路够开通,很多业务场景能都使用。我们都会去网吧上网,假如这个网吧有三台机器,网费是一秒钟,三个人同时上网,如果时间到了自动下机,我们该如何设计?我们如果知道DelayQueue的话,这个问题就变得非常简单了,无非是所有的上网者全部放到一个队列中,如果过期了则从队列中移除。话不多说,直接上代码。

收线我们先设计上网者的类:

 1 public class Wangmin implements Delayed {
 2
 3     private String name;
 4     //身份证
 5     private String id;
 6     //截止时间
 7     private long endTime;
 8     //定义时间工具类
 9     private TimeUnit timeUnit = TimeUnit.SECONDS;
10
11     public Wangmin(String name,String id,long endTime){
12         this.name=name;
13         this.id=id;
14         this.endTime = endTime;
15     }
16
17     public String getName(){
18         return this.name;
19     }
20
21     public String getId(){
22         return this.id;
23     }
24
25     /**
26      * 用来判断是否到了截止时间
27      */
28     @Override
29     public long getDelay(TimeUnit unit) {
30         //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
31         return endTime - System.currentTimeMillis();
32     }
33
34     /**
35      * 相互批较排序用
36      */
37     @Override
38     public int compareTo(Delayed delayed) {
39         Wangmin w = (Wangmin)delayed;
40         return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0;
41     }
42
43 }  

这里需要指出的是,必须要实现Delayed接口。

网吧的类,实现Runnable接口

 1 public class WangBa implements Runnable {
 2
 3     private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();
 4
 5     public boolean yinye =true;
 6
 7     public void shangji(String name,String id,int money){
 8         Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis());
 9         System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"交钱"+money+"块,开始上机...");
10         this.queue.add(man);
11     }
12
13     public void xiaji(Wangmin man){
14         System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"时间到下机...");
15     }
16
17     @Override
18     public void run() {
19         while(yinye){
20             try {
21                 Wangmin man = queue.take();
22                 xiaji(man);
23             } catch (InterruptedException e) {
24                 e.printStackTrace();
25             }
26         }
27     }
28
29     public static void main(String args[]){
30         try{
31             System.out.println("网吧开始营业");
32             WangBa siyu = new WangBa();
33             Thread shangwang = new Thread(siyu);
34             shangwang.start();
35
36             siyu.shangji("路人甲", "123", 1);
37             siyu.shangji("路人乙", "234", 10);
38             siyu.shangji("路人丙", "345", 5);
39         }
40         catch(Exception e){
41             e.printStackTrace();
42         }
43
44     }
45 }  

运行程序,输出如下:

1 网吧开始营业
2 网名路人甲 身份证123交钱1块,开始上机...
3 网名路人乙 身份证234交钱10块,开始上机...
4 网名路人丙 身份证345交钱5块,开始上机...
5 网名路人甲 身份证123时间到下机...
6 网名路人丙 身份证345时间到下机...
7 网名路人乙 身份证234时间到下机...

134的网名一秒钟之后下机,345的网民五秒钟之后下机,234的网民十秒钟下机。执行完成后,程序依然不会停止,因为while循环没有结束,也就是说网吧依旧还在营业,我们只是模拟一个场景,我们在实际的业务中可以提供接口去让网吧停止营业。还是那句话,只要自己善于思考,可以总结出非常多的适合自己业务的一些设计方法,并不需要仅仅局限于Java的设计模式,源于前人的标准,而又有自己的特色。

时间: 2024-10-24 03:35:29

多线程设计模式(一)的相关文章

java多线程设计模式

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了.一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程. Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法: Thread t = new Thread(); t.start(); start()方法是

理解多线程设计模式(转)

多线程设计模式:1.Single Threaded Execution Pattern   [同一时刻只允许一个线程操作] 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了.总结:在多个线程同时要访问的方法上加上synchronized关键字. 2.Immutable Pattern   [变量赋值一次后只能读取,不能改变.]   比喻:一夫多妻制,多个妻子共享一个丈夫.一旦赋值,任何一个妻子不能更改共享的 husband为其它人.   总结:将多线程共享的变量用final关键字

理解多线程设计模式

多线程设计模式:1.Single Threaded Execution Pattern   [同一时刻只允许一个线程操作]        比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了.   总结:在多个线程同时要访问的方法上加上synchronized关键字. 2.Immutable Pattern   [变量赋值一次后只能读取,不能改变.]   比喻:一夫多妻制,多个妻子共享一个丈夫.一旦赋值,任何一个妻子不能更改共享的 husband为其它人.   总结:将多线程共享的变

多线程设计模式总结(一)

并发程序的编程与设计是一个难点,也是程序员必须掌握的一个点.工作之后写的第一个软件里面也有并发编程,当时在设计并发这块感觉好复杂,最后的实现感觉也有点乱. 当时就想好好学习一下并发编程的设计,但是一直没有时间.今年看了两本并发编程相关的书,<多线程设计模式>和<Java并发编程与实战>.本想着和设计模式一样,多线程设计模式也能提供很多模式可供套用,但是实际情况并不是如此,多线程设计模式讲的东西多为基础,并且内容也已经有点过时了,市面上<多线程设计模式>这本书也已经很难买

多线程设计模式总结(三)

接上一篇<多线程设计模式总结(二)>,这篇博客再聊一下最复杂的Active Object模式 12)Active Object Active Object模式,也称为Actor模式.Active Object即主动对象,它不仅拥有独立线程,并且可以从外部接收异步消息,并能配合需要返回处理结果.这里的Active Object不是指一个对象,而是指将一群对象组织起来,对外表现为一个整体,这个整体拥有独立线程,并能接收外部的异步消息,这个整体(Active Object)处理完异步消息后还可以返回

多线程设计模式总结(二)

接上一篇<多线程设计模式总结(一)>,这篇博客再介绍5个多线程设计模式 7)Thread-Per-Message 实现某个方法时创建新线程去完成任务,而不是在本方法里完成任务,这样可提高响应性,因为有些任务比较耗时. 示例程序: 1 2 3 4 5 6 7 8 9 10 public class Host { private final Handler _handler=new Handler(); public void request(final int count, final char

多线程:多线程设计模式(一):总体介绍

多线程设计模式(一):总体介绍 多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion.不变.生产者-消费者 模式:jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池:    锁(分为内部锁.重入锁.读写锁).ThreadLocal.信号量等在并发控制中发挥着巨大的作用. 多线程设计模式:1.Single Threaded Execution Pattern   [同一时刻只允许一个线程操作

Java多线程设计模式(4)线程池模式

前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式主要包括三个部分: 1,Request参与者(委托人),也就是消息发送端或者命令请求端 2,Host参与者,接受消息的请求,负责为每个消息分配一个工作线程. 3,Worker参与者,具体执行Request参与者的任务的线程,由Host参与者来启动. 由于常规调用一个方法后,必须等待该方法完全执行完毕

多线程设计模式

第1章 Single Threaded Execution——能通过这座桥的,只有一个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-Consumer——我来做,你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-Per-Message——这个工作交给你了 第8章 Worker Thread——等到工

Java多线程设计模式wait和notify机制总结

Java多线程设计模式wait和notify机制总结: wait和notify方法必须写在synchronized方法内,即在调用wait和notify方法前,需先获得对象锁: 调用wait方法则释放锁:wait方法返回后,需获得对象锁才可继续执行下面语句: 多个线程wait时,若另外的线程调用notify方法后,由JVM决定唤醒其中一个线程: 多个线程wait时,若另外的线程调用notifyAll方法,则唤醒所有wait线程,但是只有其中一个线程可以获得对象锁,执行wait下面的语句,其余的等