浅记Java多线程的三种实现方式

在JDK中,唯一带边线程的只有Thread,而无论是实现Runnable还是Callable,都只是对任务的抽象。任务和线程的关系:线程可以有很多个需要完成的任务。

启动线程的方式:

  1. X extends Thread;,然后X.run
  2. X implements  Runnable;然后交给Thread运行
  3. X implements  Callable;然后交给Thread运行

第1、2方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

参见代码:

public class NewThread {
	/*扩展自Thread类*/
	private static class UseThread extends Thread{
		@Override
		public void run() {
			super.run();
			//do my work
			System.out.println("I am extends Thread");
		}
	}
	
	/*实现Runnable接口*/
	private static class UseRun implements Runnable{

		@Override
		public void run() {
			System.out.println("I am implements Runnable");
		}
	}
	
	/*实现Callable接口,允许有返回值*/
	private static class UseCall implements Callable<String>{

		@Override
		public String call() throws Exception {
			System.out.println("I am implements Callable");
			return "CallResult";
		}
	}
	
	public static void main(String[] args) 
			throws InterruptedException, ExecutionException {

		UseThread useThread = new UseThread();
		useThread.start();

		UseRun useRun = new UseRun();
		new Thread(useRun).start();


		UseCall useCall = new UseCall();
		FutureTask<String> futureTask = new FutureTask<>(useCall);
		new Thread(futureTask).start();
		//do my work
		//.....
		System.out.println(futureTask.get());  //同步阻塞的
	}
}

 

 

Runnable:

是一个接口,在它里面只声明了一个run()方法,由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

Callable:

位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call(),这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。

Future:

FutureTask本质上是Runnable和Callable的实现类,就是一个任务类,主函数也是run()。

就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果

 

因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。

FutureTask类实现了RunnableFuture接口,RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。

 

 

事实上,FutureTask是Future接口的一个唯一实现类。

要new一个FutureTask的实例,有两种方法:

 

发布了173 篇原创文章 · 获赞 430 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/LucasXu01/article/details/105070046
今日推荐