多线程——实现Callable接口

前两篇博客(多线程——继承Thread类多线程——实现Runnable接口
)介绍了java使用线程的两种方法,这篇博客继续介绍第三种方法——实现Callable接口。

先说一下Runnable和Callable的区别:

1、Callable规定的方法是call(),Runnable规定的方法是run().

2、Callable的任务执行后可返回值,而Runnable的任务是不能返回值得

3、call方法可以抛出异常,run方法不可以

4、运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

还沿用前两篇博客的例子,只不过这里稍作改动。现在我们不仅要输入单词的长度,而且还要求计算出字符串数组中所有单词的长度之和。

很明显,这样一改动,多线程的执行体就需要有一个返回值,用以计算所有单词的长度之和。而runnable中的run方法是不能有返回值的,所以,这里我们只能使用callable。具体代码如下:

package test;

import java.util.HashSet;
import java.util.Set;
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 Test1{
	public static void main(String [] args ) {
		String [] words = {"first","second","world","thread"};

		//创建一个线程池
		ExecutorService pool = Executors.newCachedThreadPool(  );
        Set<Future<Integer>> set = new HashSet<Future<Integer>>();

        for (String word: words) {
            Callable<Integer> callable = new testCallable(word);
            Future<Integer> future = pool.submit(callable);
            set.add(future);
        }
        int sum = 0;
        for (Future<Integer> future : set) {
            try {
				sum += future.get();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
        }
        System.out.println("数组中所有单词的总长度为:" + sum);
	}

}

class testCallable implements Callable<Integer>{
	private String word;

	public testCallable(String word){

		this.word = word;
	}

	@Override
	public Integer call() throws Exception {
		System.out.println(Thread.currentThread().getName() + ": 开始执行!" );
		try {
			//假设处理需要2秒
			Thread.currentThread().sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": 正在处理!" );
		System.out.println(Thread.currentThread().getName() + ": " + word + "长度为:" + word.length());
		return Integer.valueOf(word.length());
	}
}

执行结果如下:

pool-1-thread-1: 开始执行!

pool-1-thread-3: 开始执行!

pool-1-thread-4: 开始执行!

pool-1-thread-2: 开始执行!

pool-1-thread-1: 正在处理!

pool-1-thread-1: first长度为:5

pool-1-thread-3: 正在处理!

pool-1-thread-3: world长度为:5

pool-1-thread-2: 正在处理!

pool-1-thread-2: second长度为:6

pool-1-thread-4: 正在处理!

pool-1-thread-4: thread长度为:6

数组中所有单词的总长度为:22

至此,java中创建线程的三种方法都以介绍完毕。当然,了解了这些只能说明对于多线程你刚刚入门,更多关于多线程的知识还有待于我们继续发掘,深入研究。

多线程——实现Callable接口

时间: 2024-08-01 01:10:39

多线程——实现Callable接口的相关文章

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

ThreadPoolExecutor提供了另一个非常强有力的接口,那就是callable.这个接口和runnable类似,但是实现这个 接口的方法是call方法,这个方法是可以返回值的,弥补了runnable不能返回值的悲哀.而且这个方法可以配合ThreadP oolExecutor使用,获得Future接口,从这个接口的名字我们就能知道,返回的这个类似于指向这个线程的一个指针,我 们能通过这个Future接口知道当前线程的运行情况,包括是否已经完成任务,目前运行情况,运行完成后的返回值等, 而

Java总结(十一)——通过Callable接口实现多线程,生产者消费者问题,多线下载(复制)文件

一.通过Callable接口实现多线程 1.Callable接口介绍: (1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法 (2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象 2.Callable接口实现多线程的应用场景 (1)当父线程想要获取子线程的运行结果时 3.使用Callable接口实现多线程的步骤 (1)第一步:创建Callable子类的实例化对象 (2)第二步:创建FutureTask对象,并将Cal

【多线程实现方案三:实现Callable 接口】

多线程实现的方式三: A:创建一个线程池对象,控制要创建几个线程对象. public static ExecutorService newFixedThreadPool(int nThreads) B:做一个类实现Callable接口. C:调用如下方法即可 Future<?> submit(Runnable task) <T> Future<T> submit(Callable<T> task) D:我就要结束,可以吗? 可以. package com.t

java多线程 -- 创建线程的第三者方式 实现Callable接口

Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的.但是 Runnable 不会返回结果,并且无法抛出经过检查的异常.Callable 需要依赖FutureTask ,FutureTask 也可以用作闭锁. 例子: package com.company; import java.util.concurrent.Callable;

Java多线程和并发(四),线程返回值获取方式和Callable接口

目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Callable接口 1.主线程等待法 public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.currentThread().sleep(50

多线程——通过Callable实现(30)

视频:https://edu.aliyun.com/course/36/learn?spm=5176.8764728.0.0.fVZ5cb#lesson/433 1.从JDK1.5开始,追加了一个新的开发包:java.util.concurrent,这个开发包主要是进行高性能编程使用的,即这个开发包中会提供一些高并发操作中才会使用的类.在这个包里面定义有一个新的接口: public interface Callable<V> { public V call() throws Exception

多线程——实现Runnable接口

上篇博客(多线程--继承Thread类)介绍了java多线程的第一种实现方法--继承Thread类,这篇博客介绍第二种方法--实现Runnable接口,并实现run方法. 还用上篇博客的例子,现在用第二种方法实现.具体代码如下: public class Test2 implements Runnable{ private String word; public Test2(String word){ this.word = word; } @Override public void run()

Callable接口、Runable接口、Future接口

1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线程编程简单直接. 但Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值.没有返回值这点稍微有点麻烦.不能声明抛出检查型异常则更麻烦一些. public void run()方法契约意味着你必须捕获并处理检查型异常.即使你小心地保存了异常信息(在捕获异常时)以便稍后检查,但也

Java Callable接口、Runable接口、Future接口

1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线程编程简单直接. 但Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值.没有返回值这点稍微有点麻烦.不能声明抛出检查型异常则更麻烦一些. public void run()方法契约意味着你必须捕获并处理检查型异常.即使你小心地保存了异常信息(在捕获异常时)以便稍后检查,但也