Thread
public class MyThread extends java.lang.Thread(){
public void run(){
...
}
}
启动
new MyThread().run();
Runnable
public class MyThread implements java.lang.Runnable {
public void run(){
...
}
}
启动
new Thread(new MyThread()).run();
ExecutorService/Callable/Future
ExecutorService executorService = ...
Callable<Object> task=new Callable<Object>() {
public Object call() throws Exception {
return null;
}
};
Future future=executorService.submit(task);
ExecutorService可以启动线程执行的方法
- Future submit(Callable task)
- Future submit(Runnable task)
- void execute(Runnable task)
submit和execute方法的区别
- 接收的参数不一样
- submit有返回值,而execute没有
- submit方便Exception处理
Executor接口
执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():
Callable接口
类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。实现者定义了一个不带任何参数的叫做 call 的方法。
Future接口
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future