实现多线程方法有哪些
实现多线程方法
继承Thread类;
实现Runnable接口;
实现Callable接口通过FutureTask包装器来创建Thread线程;
使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService)
继承Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方式就是通过调用start()实例方法。start() 方法是一个native方法,它将启动一个新线程,并执行run()方法。
这时候我们再来看一下实现Runnable接口的方式,因为一个类他可能继承了其他类,由于java对类来说是单继承,所以这里只能实现接口。他的线程开启方式是将自己赋给Thread对象中,通过该对象调用run方法
而上面两种事实上实现一种无返回结果任务。当我们需要实现有返回结果的任务,就必须通过实现Callable接口,重写call方法,执行器(线程池接口ExecutorService)执行该任务后返回一个Future对象,在该对象中调用get方法就可以获得Callable任务返回的Object了。在结合线程池接口ExecutorService,就可以实现传说中的又返回结果的多线程了。
备注:
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;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {// 模拟耗时任务Thread.sleep(2000);return "任务完成!";}}public class CallableExample {public static void main(String[] args) throws InterruptedException, ExecutionException {// 创建线程池ExecutorService executorService = Executors.newFixedThreadPool(2);// 提交 Callable 任务Future<String> future1 = executorService.submit(new MyCallable());Future<String> future2 = executorService.submit(new MyCallable());// 获取任务结果String result1 = future1.get();String result2 = future2.get();System.out.println(result1);System.out.println(result2);// 关闭线程池executorService.shutdown();}}