java线程(一)

77 阅读2分钟

「这是我参与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();可以得到返回的执行结果

注意:FutureTask.run()不能产生新线程