夜光 带你走进 Java基础编程实战(二十七 线程)

夜光序言:

 

我喜欢想着你睡去,因为听说这样能在梦里与你相遇~~

 

正文:

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    
    /**
     * 夜光~~
     * 假定有三行数,用三个线程分别计算每一行的和,最终计算总和
     * @param args
     */
    public static void main(String[] args) {
        final int[][] numbers = new int[3][5];
        final int[] results = new int[3];
        int[] row1 = new int[]{1, 2, 3, 4, 5};
        int[] row2 = new int[]{6, 7, 8, 9, 10};
        int[] row3 = new int[]{11, 12, 13, 14, 15};
        numbers[0] = row1;
        numbers[1] = row2;
        numbers[2] = row3;
        
        //夜光  上面就是一个简单的数组化定义~~帅气
        
        CalculateFinalResult finalResultCalculator = new CalculateFinalResult(results);
        CyclicBarrier barrier = new CyclicBarrier(3, finalResultCalculator);
        //当有3个线程在barrier上await,就执行finalResultCalculator
        
        for(int i = 0; i < 3; i++) {
            CalculateEachRow rowCalculator = new CalculateEachRow(barrier, numbers, i, results);
            new Thread(rowCalculator).start();
        }        
    }
}

class CalculateEachRow implements Runnable {

    final int[][] numbers;
    final int rowNumber;
    final int[] res;
    final CyclicBarrier barrier;
    
    CalculateEachRow(CyclicBarrier barrier, int[][] numbers, int rowNumber, int[] res) {
        this.barrier = barrier;
        this.numbers = numbers;
        this.rowNumber = rowNumber;
        this.res = res;
    }
    
    @Override
    public void run() {
        int[] row = numbers[rowNumber];
        int sum = 0;
        for (int data : row) {
            sum += data;
            res[rowNumber] = sum;
        }
        try {
            System.out.println(Thread.currentThread().getName() + ": 计算第" + (rowNumber + 1) + "行结束,结果为: " + sum);
            barrier.await(); //等待!只要超过3个(Barrier的构造参数),就放行。
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
    
}


class CalculateFinalResult implements Runnable {
    final int[] eachRowRes;
    int finalRes;
    public int getFinalResult() {
        return finalRes;
    }
    
    CalculateFinalResult(int[] eachRowRes) {
        this.eachRowRes = eachRowRes;
    }
    
    @Override
    public void run() {
        int sum = 0;
        for(int data : eachRowRes) {
            sum += data;
        }
        finalRes = sum;
        System.out.println("最终结果为: " + finalRes);
    }
    
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值