定义解释
Runnable:接口,线程任务的接口定义,一个run方法,无返回值,创建的线程无法获取返回值。
Callable<T>:接口,线程任务的接口定义,一个call方法,有返回值,返回值类型为指定的泛型。
Future<T>:接口,是Callable、Runnable(FutureTask可以将Runnable转换为Callable类型)的调度容器,它可以对执行的线程进行取消,查询是否完成,获取结果等操作,get方法获取结果会阻塞,直到任务返回结果。
FutureTask<T>:类,实现RunnableFuture接口的类,RunnableFuture继承了Runnable、Future<T>,所以相当于是实现类Runnable、Callable<T>接口的一个实现类,相当于具有Runnable和Future的功能。
Thread:类,实现Runnable接口的类,所以具有Runnable的特性,它的功能还有包装线程任务,作为异步任务的执行者,管理异步任务。
Executors:类,创建各种线程池,还有将Runnable转换为Callable的方法等。
ExecutorService:接口,各种类型线程池的接口定义。
所以创建线程有三种方式:
//FutureTask的一个构造方法: public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable }
//Executors的callable方法,返回一个RunnableAdapter实例: public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }
//RunnableAdapter是Executors的静态内部类,实现Callable接口 static final class RunnableAdapter<T> implements Callable<T> { final Runnable task; final T result; RunnableAdapter(Runnable task, T result) { this.task = task; this.result = result; } public T call() { task.run(); return result; } }来看下线程的实现方法:
Thread thread = new Thread(new TaskA()); thread.start();
TaskB task = new TaskB(); task.start();方法三(实现Callable接口结合FutureTask):
TaskC task = new TaskC(); //带有返回值的线程 FutureTask<Integer> future = new FutureTask<Integer>(task); Thread thread = new Thread(future); thread.start(); System.out.println("获取Callable任务的返回值:" + future.get()); //FutureTask也可以运行Runnable任务,FutureTask会在构造方法里面将Runnable转换为Callable, 指定的返回值为 线程的返回值 FutureTask<Integer> future1 = new FutureTask<Integer>(new TaskA(), 2); thread = new Thread(future1); thread.start(); System.out.println("获取Runnable任务的返回值:" + future1.get());补充一个使用线程池调度的方式:
//创建一个同时只能执行一个任务的线程池 ExecutorService service = Executors.newSingleThreadExecutor(); TaskA taskA = new TaskA(); TaskB taskB = new TaskB(); //execute只能执行Runnable类型的任务,没有返回值 service.execute(taskA); service.execute(taskB); //submit执行Runnable类型的任务,返回值为null Future<?> future = service.submit(taskA); System.out.println("获取Runnable任务的返回值:" + future.get()); future = service.submit(taskA,2); System.out.println("获取Runnable任务的返回值:" + future.get()); TaskC taskCallable = new TaskC(); future = service.submit(taskCallable); System.out.println("获取Callable任务的返回值:" + future.get());
藏家569 2025-03-28
藏家838 2025-03-29
奇美拉 2025-03-29
许老头 2025-03-28
藏家942 2025-03-28
mei 2025-03-28
藏家113 2025-03-28
藏家518 2025-03-28
藏家372 2025-03-28
藏家372 2025-03-28