• 多线程的设计模式


      并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行结构的程序通常更为复杂。因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍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已经实现,我们可以直接使用。

      

  • 相关阅读:
    linux基础_第一篇_IT运维介绍
    Java实现文件分割和文件合并实例
    dotweb——go语言的一个微型web框架(三)路由注册
    dotweb——go语言的一个微型web框架(二)启动dotweb
    dotweb——go语言的一个微型web框架(一)
    Linq的查询操作符
    dsfgdfg
    .NET Entity Framework (with Oracle ODP.NET) -Code First
    .NET Entity Framework (with Oracle ODP.NET)
    ODP.NET 之 ExecuteNoQuery 执行 Merge into 返回值
  • 原文地址:https://www.cnblogs.com/syousetu/p/6755365.html
Copyright © 2020-2023  润新知