`
BradyZhu
  • 浏览: 248174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java多线程之~~~Callable接口获得返回值

 
阅读更多

ThreadPoolExecutor提供了另一个非常强有力的接口,那就是callable。这个接口和runnable类似,但是实现这个

接口的方法是call方法,这个方法是可以返回值的,弥补了runnable不能返回值的悲哀。而且这个方法可以配合ThreadP

oolExecutor使用,获得Future接口,从这个接口的名字我们就能知道,返回的这个类似于指向这个线程的一个指针,我

们能通过这个Future接口知道当前线程的运行情况,包括是否已经完成任务,目前运行情况,运行完成后的返回值等,

而且每个任务创建后直接通过ThreadPoolExecutor的submit方法提供,有一种非常自动化的感觉。爱不释手,简直停不

下来。下面我们就以计算多个数字的阶层为例子演示一下这个接口的使用方法。


package com.bird.concursey.charpet6;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class FactorialCalculator implements Callable<Integer> {
	
	private int number;
	
	public FactorialCalculator(int number) {
		super();
		this.number = number;
	}

	@Override
	public Integer call() throws Exception {
		int result = 1;
		if(number == 0 || number == 1) {
			result = 1;
		}else{
			for(int i = 2; i <= number; i++) {
				result *= i;
				TimeUnit.MILLISECONDS.sleep(20);
			}
		}
		System.out.printf("%s: %d\n",Thread.currentThread().
				getName(),result);
		return result;
	}
	
	public static void main(String[] args) {
		ThreadPoolExecutor execute = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);
		List<Future<Integer>> results = new ArrayList<Future<Integer>>();
		Random random = new Random();
		for(int i = 0; i < 10; i++) {
			int number = random.nextInt(20);
			FactorialCalculator calcu = new FactorialCalculator(number);
			Future<Integer> result = execute.submit(calcu);
			results.add(result);
		}
		
		do{
			System.out.printf("Main: Number of Completed Tasks:%d\n",execute.getCompletedTaskCount());
			for (int i=0; i<results.size(); i++) {
				Future<Integer> result=results.get(i);
				System.out.printf("Main: Task %d: %s\n",i,result.isDone());
			}
			try {
				TimeUnit.MILLISECONDS.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}while(execute.getCompletedTaskCount() < results.size());
		
		System.out.printf("Main: Results\n");
		for(Future<Integer> fus : results) {
			try {
				System.out.printf("Main: Task %d: %d\n",1,fus.get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}
		
		execute.shutdown();
	}

}

记住使用完成后,一定记得shutdown,这个方法,如果不调用这个方法,execute就会一直等待运行,即使没有线程

正在运行了,shundown并不是立刻关闭所有的线程,他只是表名,当他控制的其他线程完成后,execute会自动关闭

而已。

分享到:
评论

相关推荐

    Java多线程之Callable接口的实现

    主要介绍了Java多线程之Callable接口的实现,Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常。感兴趣的小伙伴们可以参考一下

    java多线程返回值使用示例(callable与futuretask)

    主要介绍了多线程返回值使用示例(callable与futuretask),需要的朋友可以参考下

    多线程机制

    7、 浅析 Java Thread.join() : java多线程实现主线程等待所有子线程执行完毕 16 8、 线程运行中抛出异常的处理 19 9、 Callable 有返回值的线程 20 10、 Callable结合FutureTask的多线程使用(免打扰模式) 24

    java多线程Future和Callable类示例分享

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...

    Java多线程实现四种方式原理详解

    1.继承Thread类,重写run方法 ...后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中 1. 继承Thread类 public class Thread

    【java面试题】综合性经典Java面试题

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。 线程的概念 线程进程区别 在...

    Java 实现多线程的几种方式汇总

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    \java超强笔记(超级经典)

    java.util.concurrent 包含了常用的多线程工具,是新的多线程工具的主体。 java.util.concurrent.atomic 包含了不用加锁情况下就能改变值的原子变量。 java.util.concurrent.locks 包含锁定的工具。 ...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    LeetCode判断字符串是否循环-java:Java

    (2)多线程可以用三种方式实现,继承thread类,实现runnable接口的实现类实例传入thread构造器创建thread实例, 实现callable接口的实现类实例传入future task构造器,将futuretask对象传入thread构造器,用...

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Python核心编程第二版(ok)

     11.1.2 返回值与函数类型   11.2 调用函数   11.2.1 函数操作符   11.2.2 关键字参数  11.2.3 默认参数   11.2.4 参数组   11.3 创建函数   11.3.1 def语句   11.3.2 声明与定义比较   ...

    Python核心编程第二版

     11.1.2 返回值与函数类型   11.2 调用函数   11.2.1 函数操作符   11.2.2 关键字参数  11.2.3 默认参数   11.2.4 参数组   11.3 创建函数   11.3.1 def语句   11.3.2 声明与定义比较   ...

Global site tag (gtag.js) - Google Analytics