论坛首页 Java企业应用论坛

jdk5多线程新特性--运行的时候怎么会阻塞

浏览 1868 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-11-18  
废话不多说,直接代码上。。。。


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class ConcurrentCalculator2 {

	private ExecutorService exec;
	CompletionService<Long> service;
	private int cpuCoreNumber;
	private List<Future<Long>> tasks = new ArrayList<Future<Long>>();

	// 内部类
	class SumCalculator implements Callable<Long> {
		private int[] numbers;
		private int start;
		private int end;

		public SumCalculator(final int[] numbers, int start, int end) {
			this.numbers = numbers;
			this.start = start;
			this.end = end;
		}

		public Long call() throws Exception {
			Long sum = 0l;
			for (int i = start; i < end; i++) {
				sum += numbers[i];
			}
			return sum;
		}
	}

	public ConcurrentCalculator2() {
		cpuCoreNumber = Runtime.getRuntime().availableProcessors();
		exec = Executors.newFixedThreadPool(cpuCoreNumber);
		service = new ExecutorCompletionService<Long>(exec);
	}

	public Long sum(final int[] numbers) {
		// 根据CPU核心个数拆分任务,创建FutureTask并提交到Executor
		for (int i = 0; i < cpuCoreNumber; i++) {
			int increment = numbers.length / cpuCoreNumber + 1;
			int start = increment * i;
			int end = increment * i + increment;
			if (end > numbers.length)
				end = numbers.length;
			SumCalculator subCalc = new SumCalculator(numbers, start, end);

			tasks.add(service.submit(subCalc));
			/*
			 * FutureTask<Long> task = new FutureTask<Long>(subCalc);
			 * tasks.add(task); if (!exec.isShutdown()) { exec.submit(task); }
			 */
		}

		return getResult();
	}

	/**
	 * 迭代每个子任务,获得部分和,相加返回
	 * 
	 * @return
	 */

	public Long getResult() {
		Long result = 0l;
		for (int i = 0; i < tasks.size(); i++) {
			try {
				result += service.take().get(1, TimeUnit.SECONDS);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}

	public void close() {
		exec.shutdown();
	}
}




mian方法:

public class ExecutCalculator {
	public static void main(String[] str) {
		int[] numbers = new int[100000];
		for (int i = 0; i < 100000; i++) {
			numbers[i] = i;
		}
		long start = System.currentTimeMillis();
		ConcurrentCalculator2 calc = new ConcurrentCalculator2();
		Long sum = calc.sum(numbers);
		for (int i = 0; i < 10; i++)
			sum = calc.sum(numbers);

		long end = System.currentTimeMillis();

		System.out.println(end - start);
		System.out.println(sum);
		calc.close();

		long start1 = System.currentTimeMillis();
		ExecutCalculator executCalculator = new ExecutCalculator();
		long sum2 = executCalculator.sumlocal(numbers);
		for (int i = 0; i < 10; i++) {
			sum2 += executCalculator.sumlocal(numbers);
		}
		long end1 = System.currentTimeMillis();

		System.out.println(end1 - start1);
		System.out.println(sum2);
	}

	public long sumlocal(int[] numbers) {
		long sum = 0l;
		for (int i = 0; i < numbers.length; i++) {
			sum += numbers[i];
		}
		return sum;

	}
}




论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics