1 接口定义
1) Callable接口
public interface Callable<V> { V call() throws Exception; }
2) Runnable接口
public interface Runnable { public abstract void run(); }
2 不同点和相同点
1)相同点
都是接口,都可编写多线程程序,都是调用Thread.start()启动线程
2)不同点
Callable可以返回执行结果,是个泛型,与Future、FutureTask配合可以通过FutureTask.get()获取异步执行的结果,但是Runnable不可以。
Callable里面有取消这个任务,而且异常可以外抛,但是Runnable异常只能内部run消化。
FutureTask.get()得到异步执行的结果,此方法会阻塞主进程的继续往下执行。
3 Callable测试用例
import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class TestCallableAndFuture { public static void main(String[] args) { //构建Callable Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(2000); return "chenyu callable finish"; } }; //构建FutureTask FutureTask<String> futureTask = new FutureTask<>(callable); //运行线程 new Thread(futureTask).start(); try { System.out.println("chenyu begin"); System.out.println(futureTask.isDone()); //futureTask.cancel(true); if (!futureTask.isCancelled()) { System.out.println(futureTask.get()); System.out.println(futureTask.isDone()); System.out.println("chenyu end"); } else { System.out.println("the thread is cancel"); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
4 运行结果
如果注释掉// futureTask.cancel(true)运行结果如下
chenyu begin false chenyu callable finish true chenyu end
如果不注释掉futureTask.cancel(true)运行结果如下
chenyu begin false the thread is cancel