「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」 @[toc]
JAVA线程的实现方式
一.继承Thread类
继承Thread类,
使用:重写run方法,thread.start()方法开启线程并执行run()方法。
二.实现Runnable接口
返回值为void,
使用:重写run()方法,使用方法是将runnable实现类对象传进Tread内作为参数,使用start()方法开启线程并执行run()方法。
三.Callable、Future和FutureTask
①Callable
返回值为 T 泛型,可以抛出异常
使用:重写call()方法,
②Future
一般与ExecutorService es = Executors.newCachedThreadPool(); 线程池一起用
一般与ExecutorService es = Executors.newCachedThreadPool(); 线程池一起用<https://blog.csdn.net/a779363384/article/details/120874709?spm=1001.2014.3001.5502>[线程池地址]
Future future = es.submit();
ExecutorService:
Future<T> submit(Callable<T> task);
Future<T> submit(Runnable task , T result);
Future<?> submit(Runnable task);
```
Future future = es.submit();
ExecutorService:
Future<T> submit(Callable<T> task);
Future<T> submit(Runnable task , T result);
Future<?> submit(Runnable task);
Future:
void get()方法会保证线程在执行完之前是阻塞的
void get(Long timeout , TimeUnit unit)方法会保证线程在规定时间前是阻塞的
boolean isDone() :如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。
boolean isCancelled() :如果任务完成前被取消,则返回true。
boolean cancel(boolean mayInterruptRunning) :如果任务还没开始,执行cancel(...)方法将返回false;如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线 程正常执行到完成),此时返回false;当任务已经完成,执行cancel(...)方法将返回false。mayInterruptRunning参数表示是否中断执行中的线程。
Future只是一个接口,我们不能直接创建对象
使用:
与线程池搭配使用
Future future = es.submit();
③FutureTask
FutureTask是Future的实现类,
FutureTask<T> implements RunnableFuture<T>
RunnableFuture<T> extends Runnable, Future<V>
看到其实FutureTask是Future,Runnable的实现类
使用:
与线程池一起使用
ExecutorService es = Executors.newCachedThreadPool();
FutureTask futureTask = new FutureTask<>(Callable c);
es.execute(futureTask);
使用futureTask.get();可以得到返回的执行结果