一、Callable接口
Callable接口方法:
1.V call():计算结果,如果无法计算结果,则抛出一个异常。
Callable接口和Runnable接口区别?
1、Callable接口有返回值,Runnable接口没有返回值
2、Callable接口call方法可以抛出异常,Runnable接口中run方法不能抛出异常
3、实现方法名不同一个是call一个是run
FutureTask是Runnable接口的一个实现类,并且此实现类的构造方法和Callable有关。
所以可通过FutureTask来创建Callable接口的多线程任务。
FutureTask是Runnable接口的一个实现类,并且此实现类的构造方法和Callable有关。
public class FutureTask<V>extends Objectimplements RunnableFuture<V>
FutureTask构造方法:
1.FutureTask(Callable<V> callable):创建一个 FutureTask,一旦运行就执行给定的Callable
2.FutureTask(Runnable runnable, V result):创建一个 FutureTask,一旦运行就执行给定的
Runnable,并安排成功完成时 get 返回给定的结果
FutureTask常用的方法:
1.boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。
2.protected void done():当此任务转换到状态 isDone(不管是正常地还是通过取消)时,
调用受保护的方法。
3.V get():如有必要,等待计算完成,然后获取其结果。
4.V get(long timeout, TimeUnit unit):如有必要,最多等待为使计算完成所给定的时间之后,
获取其结果(如果结果可用)。
5.boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。
6.boolean isDone():如果任务已完成,则返回 true。
7.void run():除非已将此 Future 取消,否则将其设置为其计算的结果。
8.protected boolean runAndReset():执行计算而不设置其结果,然后将此 Future 重置为
初始状态,如果计算遇到异常或已取消,则该操作失败。
9.protected void set(V v):除非已经设置了此 Future 或已将其取消,否则将其结果设置为
给定的值。
10.protected void setException(Throwable t):除非已经设置了此 Future 或已将其取消,
否则它将报告一个 ExecutionException,并将给定的 throwable 作为其原因。
Callable接口和Runnable接口示例:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadDemo6 {
public static void main(String[] args) throws Exception {
new Thread(new MyThread1(),"A").start();
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread2());
FutureTask<Integer> futureTask2 = new FutureTask<Integer>(() ->{
return 300;
});
new Thread(futureTask2,"B").start();
new Thread(futureTask,"C").start();
while (!futureTask2.isDone()) {
System.out.println("wait...");
}
System.out.println(futureTask2.get());
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" in Runnable");
}
}
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+" in callable");
return 200;
}
}
二、JUC辅助类
1、减少计数CountDownLatch
2、循环栅栏CyclicBarrier
3、信号灯Semaphore
Java JUC高并发编程(一)