JAVA并发处理经验(四)并行模式与算法3:并行流水线模式

简介: 一、前言 流水线,就工厂而言,组装一个汽车;冲骨架到最后的座椅等,每一步都是有顺序。看来这个是串行的程序,但是在实际工作中,我们看到的工厂其实都不是串行的,都是一个部门甚至一个公司专业生产组装一样零件。

一、前言

流水线,就工厂而言,组装一个汽车;冲骨架到最后的座椅等,每一步都是有顺序。看来这个是串行的程序,但是在实际工作中,我们看到的工厂其实都不是串行的,都是一个部门甚至一个公司专业生产组装一样零件。这个情况下,每个公司其实已经并行的运行工作了。在程序开发中,也 存在这样的实际情况,例如一些基本的计算也是如此;

例子:(B+C)*B/2 这样的一个简单运算,我们仍然可以将其并行处理。(现实中这种计算不是需要并行,但是你想象航天数据的计算呢??)

二、流水线并行模式pipeline

2.1 首先我们需要一个中间仓库存放我们的计算中间值等等

package pattern.pipeline;

/**
 * Created by ycy on 16/1/16.
 * 定义一个计算中间体
 * 计算(B+C)*B/2=?
 * 适用场景:将我们串行的程序分为一步步流水
 */
public class Msg {
    public double i;
    public double j;
    public String orgStr=null;
}

2.2首先计算括号里面加法

package pattern.pipeline;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * Created by ycy on 16/1/16.
 */
public class Plus implements Runnable {
    public static BlockingQueue<Msg> bq = new LinkedBlockingDeque<Msg>();

    public void run() {
     while (true){
         try {
             Msg msg=bq.take();
             msg.j=msg.i+msg.j;
             Multiply.bq.add(msg);
         }catch (InterruptedException e){
             e.printStackTrace();
         }
     }
    }
}

2.3 再次计算乘法

package pattern.pipeline;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * Created by ycy on 16/1/16.
 */
public class Multiply implements  Runnable{
    public static BlockingQueue<Msg> bq=new LinkedBlockingDeque<Msg>();
    public void run() {
        while (true){
            try {
                Msg msg=bq.take();
                msg.i=msg.i*msg.j;
                Div.bq.add(msg);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

2.4最后计算除法


package pattern.pipeline;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * Created by ycy on 16/1/16.
 */
public class Div implements  Runnable{

    public static BlockingQueue<Msg> bq=new LinkedBlockingDeque<Msg>();
    public void run() {
      while (true) {
          try {
              Msg msg = bq.take();
              msg.i = msg.i / 2;
              System.out.println("计算结果" + msg.orgStr + "=" + msg.i);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
    }
}

2.5 最后我们开启三个并发计算这个公式的结果

package pattern.pipeline;

/**
 * Created by ycy on 16/1/16.
 */
public class PStreamMain {
    public static void main(String[] args) {
        new Thread(new Plus()).start();
        new Thread(new Multiply()).start();
        new Thread(new Div()).start();

        for (int i = 0; i <10 ; i++) {
            for (int j = 0; j <10 ; j++) {
                Msg msg=new Msg();
                msg.i=i;
                msg.j=j;
                msg.orgStr="(("+i+"+"+j+")*"+i+")/2";
                Plus.bq.add(msg);
            }
        }
    }
}






目录
相关文章
|
14天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
41 11
|
22天前
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
33 2
|
1月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
28 2
|
1月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
1月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
18天前
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
12 0
|
1月前
|
存储 人工智能 算法
就AI 基础设施的演进与挑战问题之流水线并行工作的问题如何解决
就AI 基础设施的演进与挑战问题之流水线并行工作的问题如何解决
|
2月前
|
设计模式 监控 Java
Java中的并发编程模式与最佳实践
随着多核处理器的普及,充分利用并发和多线程成为提高软件性能的关键。Java语言通过其丰富的并发API提供了强大的支持,使得开发者能够构建高效、可靠的并发应用程序。本文深入探讨了Java并发编程的核心概念、设计模式以及在实际开发中的最佳实践,旨在帮助读者更好地理解和掌握Java并发编程,从而编写出更加高效、稳定的应用程序。
|
2月前
|
设计模式 Java 开发者
Java中的异常处理与断路器模式
Java中的异常处理与断路器模式
|
2月前
|
存储 Java 调度
线程操纵术并行策略问题之Java的并行编程优势问题如何解决
线程操纵术并行策略问题之Java的并行编程优势问题如何解决