java 一个包含了2万个整数的数组,多线程来进行并行计算

一个包含了2万个整数的数组

计算任务:一个包含了2万个整数的数组,分拆了多个线程来进行并行计算,最后汇总出计算的结果。

数据错误的原因:4个子线程还没有执行完毕,主线程就抢到资源并输出结果
解决方案:4个子线程全部执行完毕,再让主线程抢到资源
1.休眠
Thread.sleep(10);
2.获取线程状态
while(t1.isFlag() || t2.isFlag() || t3.isFlag() || t4.isFlag()){
}
3.合并

​ t1.join();
​ t2.join();

第一种解决方案:Thread接口实现
package com.dream.work01;
public class Work {
	
	public static void main(String[] args) throws InterruptedException {
		/**
		 * 计算任务,一个包含了2万个整数的数组,分拆了多个线程来进行并行计算,最后汇总出计算的结果。
		 */
		//声明包含2万个整数的数组
		int[] is = new int[20000];
		//初始化数据
		for (int i = 0; i < is.length; i++) {
			is[i] = (i+1);
		}
		MyThread t1 = new MyThread(0, 4999, is);
		MyThread t2 = new MyThread(5000, 9999, is);
		MyThread t3 = new MyThread(10000, 14999, is);
		MyThread t4 = new MyThread(15000, 19999, is);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		//数据错误的原因:4个子线程还没有执行完毕,主线程就抢到资源并输出结果
		//解决方案:4个子线程全部执行完毕,再让主线程抢到资源
		//1.休眠
		//Thread.sleep(10);
		//2.获取线程状态
		//while(t1.isFlag() || t2.isFlag() || t3.isFlag() || t4.isFlag()){
		//}
		//3.合并
		t1.join();
		t2.join();
		t3.join();
		t4.join();
		System.out.println(t1.getSum() + t2.getSum() + t3.getSum() + t4.getSum());
	}
}
class MyThread extends Thread{
	private int startIndex;
	private int endIndex;
	private int[] is;
	private int sum;
	private boolean flag = true;
	public MyThread(int startIndex, int endIndex, int[] is) {
		this.startIndex = startIndex;
		this.endIndex = endIndex;
		this.is = is;
	}
	@Override
	public void run() {
		for (int i = startIndex; i <= endIndex; i++) {
			sum += is[i];
		}
		flag = false;
	}
	public int getSum() {
		return sum;
	}
	public boolean isFlag() {
		return flag;
	}
}

第二种解决方案:Runnable接口实现
public class Work {
	public static void main(String[] args) throws InterruptedException {
		//声明包含2万个整数的数组
		int[] is = new int[20000];
		//初始化数据
		for (int i = 0; i < is.length; i++) {
			is[i] = (i+1);
		}
		Task task1 = new Task(0, 4999, is);
		Task task2 = new Task(5000, 9999, is);
		Task task3 = new Task(10000, 14999, is);
		Task task4 = new Task(15000, 19999, is);
		Thread t1 = new Thread(task1);
		Thread t2 = new Thread(task2);
		Thread t3 = new Thread(task3);
		Thread t4 = new Thread(task4);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t1.join();
		t2.join();
		t3.join();
		t4.join();
		System.out.println(task1.getSum() + task2.getSum() + task3.getSum() + task4.getSum());
	}
}
class Task implements Runnable{
	
	private int startIndex;
	private int endIndex;
	private int[] is;
	private int sum;
	private boolean flag = true;
	public Task(int startIndex, int endIndex, int[] is) {
		this.startIndex = startIndex;
		this.endIndex = endIndex;
		this.is = is;
	}
	@Override
	public void run() {
		for (int i = startIndex; i <= endIndex; i++) {
			sum += is[i];
		}
		flag = false;
	}
	public int getSum() {
		return sum;
	}
	public boolean isFlag() {
		return flag;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值