实现多线程的第三种方式之Callable

    前面在《java多线程基础》中说过,实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口。这两种方式中真正起作用的是run方法,不过run方法并没有返回值。如果我们希望任务在完成时能够有返回值,这时就可以使用JDK1.5提供的Callable接口了,Callable是一种具有类型参数的泛型,它的类型参数表示的是从call()方法中返回的值,可以使用ExecutorServiceCompletionServicesubmit()方法来调用,返回值是Future类型,表示异步计算的结果,只能使用get()方法来获取结果。

   下面使用Callable实现打印一个斐波那契数列并返回其总和。


package com.gk.thread.callable;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Long>{

	private int count;
	
	public MyCallable(int count) {
		this.count = count;
	}
	
	@Override
	public Long call() {
		
		long x = 1 ,  y = 1;
		long z = 0;
		
		long sum = x + y;

		System.out.print("前" + count + "个斐波那契数列是 : " + x + ",  " + y + ",  ");
		for (int i=1; i<=count-2; i++) {
			z = x + y;
			System.out.print(z);
			if(i < count-2)
				System.out.print(",  ");
			
			x = y;
			y = z;
			sum += z;
		}
		System.out.println();
		
		return sum;
	}

}


测试代码


package com.gk.thread.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		
		final int NUMBER = 10;
		
		ExecutorService es = Executors.newSingleThreadExecutor();	
		
		Callable<Long> cc = new MyCallable(NUMBER);
		Future<Long> f = es.submit(cc);
		System.out.println("总数为" + f.get());
		es.shutdown();

	}

}


    虽然Callable可以获取返回值,但是我们也看到了,Callable使用起来还是很麻烦的,而且应用也不是很大,所以一般不怎么用。



猜你喜欢

转载自blog.csdn.net/leexichang/article/details/79326807
今日推荐