并行应用
标签:Java并发

并行应用

1. 并行计算

并行计算的核心点就是通过阻塞队列,如果队列中没有数据,就阻塞,如果队列中有数据,就取出来计算,然后放到下一个步骤的阻塞队列等待被计算,这样,可以根据步骤数,开启多个线程同时进行计算。

下面是计算 (B+C)*B/2,可拆成 ①A=B+C、 ②D=A*B、③D=D/2

加法

public class Plus implements Runnable{
    public static BlockingQueue<Msg> bq=new LinkedBlockingQueue<Msg>();

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

乘法

public class Multiply implements Runnable {
    public static BlockingQueue<Msg> bq=new LinkedBlockingQueue<Msg>();
    @Override
    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();
            }
        }
    }
}

除法

public class Div implements Runnable {
    public static BlockingQueue<Msg> bq=new LinkedBlockingQueue<Msg>();

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

下面的是先构造出两个初始数字,放到加法的阻塞队列中:

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 < 1000; i++) {
            for (int j = 0; j < 1000; j++) {
                Msg msg=new Msg();
                msg.i=i;
                msg.j=j;
                msg.orgStr="(("+i+"+"+j+")*"+i+")/2";
                Plus.bq.add(msg);
            }
        }
    }
}
  • 1 min read

CONTRIBUTORS


  • 1 min read