首先声明,此博文和spring没有太大关系,支持学习spring时学习的,就归纳到这个里面了
线程的实现方式
Runnable Thread Callable
Runnable Thread区别
1.Runnable 并不是一个线程,只是注明可以调用run()方法进行调用
要变成线程,需要将自身传入Thread中
2.Runable是一个接口而Thread是一个具体的实现类,因此使用Runnable能够实现出更加低耦合的程序。
3.Runable里面的实例变量可以被多个线程共享,而Thread的则是每个线程一份
public class RunnableTest {
public static void main(String[] args) throws IOException, InterruptedException {
Runnable runnable= new ImplementsRunnable();
new Thread(runnable).start();
new Thread(runnable).start();
Thread.sleep(1000);
new ExtendsThread().start();
new ExtendsThread().start();
}
}
class ImplementsRunnable implements Runnable{
private AtomicInteger counter = new AtomicInteger(0);
public void run() {
while(true){
if (counter.get() > 2) break;
System.out.println("ImplementsRunnable counter: " + counter.incrementAndGet());
}
}
}
class ExtendsThread extends Thread{
private AtomicInteger counter = new AtomicInteger(0);
public void run() {
while (true) {
if (counter.get() > 2) break;
System.out.println("ExtendsThread counter: " +counter.incrementAndGet());
}
}
}
//返回结果
ImplementsRunnable counter: 1
ImplementsRunnable counter: 2
ImplementsRunnable counter: 3
ExtendsThread counter: 1
ExtendsThread counter: 2
ExtendsThread counter: 1
ExtendsThread counter: 3
ExtendsThread counter: 2
ExtendsThread counter: 3
Runable Callable区别
1.Runnable 是JDK1.0 版本就有的类,而Callable是JDK1.5之后才有的类,所以Callable比Runnable高级
2.高级的地方:可以有返回值,可以抛出异常
Future(Callable返回的结果)
FutureTask为Future的具体实现
执行Callable.call()的时候,直接构造了Future对象,将Callable对象传入
FutueTask对象中维护Running Completed Exception字段,代表这任务是否完成
当调用Future.get()返回结果值的时候,如果为Running状态,调用object.wait()方法,使线程处于等待状态,如果线程完成时候,调用object.notifyAll(),唤醒等待线程,继续执行,getValue()返回结果
RunnableFuture(具体实现就是FutureTask)
同时继承了Runable Future接口,提供了run() 和 返回结果的接口
Executor ExecutorService
对Runnable Callable通过启动线程异步启动
对传递过来的Runnable Callable进行包装,包装为FutureTask
引用资料
http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread