天天看点

用两个线程来求1-100之间的和

用两个线程来求1-100之间的和

package com.jdk5;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

// 用两个线程来求1-100之间的和
// 要想实现此功能,需要使用JDK5.0的新功能Callable
// 实现步骤:
// 1. 编写一个类,该类需要实现Callable接口。
class OddNum implements Callable<Integer> {
	// 计算100以内奇数的和
	// 2. 在实现Callable接口类中重写call方法,该方法是线程核心方法
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for(int i=1; i<100; i+=2) {
			sum += i;
		}
		return sum;
	}
}
class EvenNum implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for(int i=2; i<= 100; i+=2) {
			sum += i;
		}
		return sum;
	}
}
public class CallableTest {
	public static void main(String[] args) {
		// 3. 创建实现了Callable接口类的对象
		OddNum odd = new OddNum();
		EvenNum even = new EvenNum();
		
		// 4. 创建FutureTask类的对象,并把实现了Callable接口类的对象以参数方式传给FutureTask类的构造器
		FutureTask<Integer> oddFuture = new FutureTask<>(odd);
		FutureTask<Integer> evenFuture = new FutureTask<>(even);
		
		// 5. 把FutureTask对象以参数的形式传Thread类的构造器来创建线程对象,并调用该对象的start()方法来启动线程
		new Thread(oddFuture).start();
		new Thread(evenFuture).start();
		
		try {
			// 6. 通过调用FutureTask对象的get()方法来获取线程执行结果
			Integer oddSum = oddFuture.get();
			Integer evenSum = evenFuture.get();
			System.out.println("总和为:" + (oddSum + evenSum));
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}