欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-10 18:15:46
...

    前面在《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可以获取返回值,但是我们也看到了,Callable使用起来还是很麻烦的,而且应用也不是很大,所以一般不怎么用。