多线程的设计模式

  并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行结构的程序通常更为复杂。因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍future、master-woeker和生产者-消费者模型。

  future模式有点类似于商品订单。比如在网购时,当看中某件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待用户请求的结果,可以继续浏览或操作其他内容。

基本思路:在client请求数据的时候,futureData先给一个空壳给客户端,然后futureData启动一个线程,什么时候将数据加载完成,Client才能使用这个数据,在futureData启动的线程中获取真实数据,真正的操作数据是在realData中获取,然后将数据依次传回来。(在这其中,用到了线程的阻塞)

代码:

Main:

 1 package com.java.day04_mode_future;
 2
 3 public class Main {
 4
 5     public static void main(String[] args) {
 6         FutureClient fc = new FutureClient();
 7         Data data = fc.request("请求参数");
 8
 9         System.out.println("请求发送成功");
10         System.out.println("做其他的事情。。。。");
11
12         String result  = data.getRequest();
13         System.out.println(result);
14
15
16     }
17
18 }

FutureClient:

 1 package com.java.day04_mode_future;
 2
 3 public class FutureClient {
 4     public Data request(final String queryStr){
 5         //1.我想要一个代理对象(Data接口的实现类),先返回给发送请求的客户端,告诉他请求已经收到,可以做其他事情
 6         final FutureData futureData = new FutureData();
 7
 8         //2.启动一个新的线程,去加载真实数据,传递给代理对象
 9         new Thread(new Runnable() {
10             public void run() {
11                 //这个线程可以慢慢加载真实对象,然后传递给代理对象
12                 RealData data = new RealData(queryStr);
13                 futureData.setRealData(data);
14
15             }
16         }).start();
17
18         return futureData;
19     }
20 }

FutureData:

 1 package com.java.day04_mode_future;
 2
 3 public class FutureData implements Data{
 4
 5
 6     private RealData realData;
 7
 8     private boolean isReady=false;
 9
10     public synchronized void setRealData(RealData realData){
11         //如果真实数据已经装载好,则直接返回
12         if(isReady){
13             return;
14         }
15
16         this.realData=realData;
17         isReady=true;
18         //进行通知
19         notify();
20     }
21
22
23     @Override
24     public synchronized String getRequest() {
25         //如果还没有装载好,则进入阻塞状态
26         while(!isReady){
27             try {
28                 wait();
29             } catch (InterruptedException e) {
30                 e.printStackTrace();
31             }
32         }
33         //返回真实数据
34         return this.realData.getRequest();
35     }
36
37
38
39
40
41 }

RealData

 1 package com.java.day04_mode_future;
 2
 3 public class RealData implements Data{
 4
 5     public String result;
 6
 7     public RealData(String queryStr){
 8         System.out.println("根据"+queryStr+"进行查询,这是一个很耗时的操作。。。");
 9         try {
10             Thread.sleep(1000);
11         } catch (InterruptedException e) {
12             e.printStackTrace();
13         }
14
15         System.out.println("操作完毕,获取结果");
16         result="得到结果";
17
18
19     }
20
21     @Override
22     public String getRequest() {
23         return result;
24     }
25
26 }

Data:

1 package com.java.day04_mode_future;
2
3 public interface Data {
4     String getRequest();
5 }

运行结果:

1 请求发送成功
2 做其他的事情。。。。
3 根据请求参数进行查询,这是一个很耗时的操作。。。
4 操作完毕,获取结果
5 得到结果

其实这个模式java已经实现,我们可以直接使用。

  

时间: 2024-08-24 02:33:01

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

联想高级Java研发面经+面试题:Spring+多线程+MySQL+设计模式

上个礼拜,之前的一个同事突然联系我说他去面了联想的JAVA开发工程师,想分享一下面试经历和面试题.我当时就拍板说,好啊! 然后就整理了一下,写了这篇文章:和大家分享一下这次面试经验和面试题. 薪资还可以啊,年薪40W+啊!多少人的梦想啊! 言归正传,和大家分享一下这次联想的面经和面试题: 联想面经: 第一轮:电话初面 第二轮:技术面谈 第三轮:高管复试 第四轮:HR最后确认 No.1:第一轮面试--电话初面 首先确认对联想的意向度(如果异地更会考虑对工作地点(北京)的意向度!联想很看重这个):其

java多线程12设计模式

1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Pattern(国防暂停模式) 4.Balking Pattern(止步模式,阻行模式) 5.Producer-Consumer Pattern(生产者-消费者模式) 6.Read-Write Lock Pattern(读-写锁模式) 7.Thread-Per-Message Pattern(每一个消息一个线

多线程编程-设计模式之不可变对象模式

Immutable Object设计模式适用场景:1.被建模对象的状态变化不频繁:设置一个专门的线程用于被建模对象状态发生变化时创建新的不可变对象.而其他线程只是读取不可变对象的状态.此场景下一个小技巧就是Manipulator对不可变对象的引用使用volatile关键字进行修饰,既可以避免使用显示锁比如synchronize,又可以保证多线程间的内存可见性.2.同时对一组相关的数据进行写操作,因此需要保证原子性此场景下为了保证操作的原子性,通常的做法是使用显示锁,但若采用Immutable O

网络与多线程的设计模式

一.概述 本文是一篇关于TCP网络服务端的常用设计模式的笔记,方便自己和已有一定的网络及线程基础知识的人查阅. 二.方式介绍 1. 同步阻塞网络模式: 基本为以下函数的顺序执行: int socket(int domain, int type, int protocol); int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); int listen(int sockfd, int backlog); int a

多线程的设计模式:Future、Master-Worker

一 简介 并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象.与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍==Future==.==Master-Worker==和==生产者-消费者==模型 二 Future模式 Future模式有点类似于商品订单.比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家等待商品送货上门即可.或者说更形象的,我们发送Ajax请求的时候,页面是异步的进行后台处理,用

多线程编程-设计模式之保护性暂挂(Guarded Suspesion)模式

Guarded Suspension模式的架构 核心是一个受保护方法(Guarded Method).该方法需要执行其所要真正执行的操作时需要满足特定的条件(Predicate,以下称之为保护条件).当该条件不满足时,执行受保护方法的线程会被挂起进入等待状态,直到该条件满足时该线程才会继续运行.此时,受保护方法才会正在执行其所要执行的操作(目标操作).GuardedObject:包含受保护方法的对象.主要方法和职责如下:-guardedMethod:受保护方法.-stateChanged:改变G

多线程设计模式简介

多线程设计模式简介 随着CPU的生产工艺从提高CPU的主频率转向多核化,以往那种靠CPU主频率提升所带来的软件的性能提升的"免费午餐"不复存在.这使得多线程编程在充分发挥系统CPU资源以及软件性能方面起到了越来越重要的作用.然而,多线程编程本身又会引入开销和其他问题,如较之简单的单线程顺序编程的复杂性.线程安全问题.死锁.活锁以及上下文切换开销等.多线程设计模式是多线程编程领域的设计模式,它可以帮助我们解决多线程编程中的许多问题. 不使用锁的情况下保证线程安全:不可变对象模式(Immu

多线程学习笔记二

单例设计模式与多线程: 设计模式:对问题行之有效的解决方式.其实是一种思想. 单例设计模式: 解决的问题:可以保证一个类在内存中的对象唯一性. 比如对于多个程序使用同一个配置信息对象时,都需要保证对象的唯一性. 如果保证唯一性? 1.不允许其他程序用new创建该类对象. 2.在该类中创建一个本类实例. 3.对外提供一个方法,让其他程序可以获取对象. 实现步骤: 1.私有化该类的构造函数. 2.通过new在本类中创建一个本类对象. 3.定义一个共有的方法,将创建的对象返回. class Singl

C++ 多线程中使用cout还是printf

在多线程的设计模式下,如果多个线程都使用cout打印信息,那么很容易出现内容交替的现象,例如下图: 代码如下: 如果把cout替换成printf,那么就不会出现这个问题,运行结果如下图: 对应代码如下: 上网搜索了下相关的内容,部分网友反馈结果是: cout不是线程安全的,要靠自己去线程同步,比较麻烦 .printf是线程安全的,也就是自己做了线程同步的处理. 这个结果有待继续考证,暂且记在这. 发现一篇对IOstream解释得比较好的文章,有一定的参考价值:http://www.cnblogs