Jamal的博客

Java中Thread和Executor的区别

真是人品好,写了文档都赶上11:02这种时间点,一种注孤生的感觉,幸亏我已经有老婆了哈哈。
这篇文章介绍一下Java中Thread和Executor的区别。

主要是翻译的这篇文章

前言

Thread和Executor都是Java里用来并发执行一些code的,他们之间最主要的区别是在于Executor能提供一个线程池的实现,当然还包括一些同步的实现包括 CountDownLatch, CyclicBarrier, Semaphore, FutureTask, Callable interface, Conditions等。Java中也提供了一个内置的线程池,以一个线程的集合并发的执行code,考虑到创建和运行一个线程是非常昂贵的操作,在之前很多Java应用都在启动的时候创建一个线程池出来,直到Java有了内置线程池,这个线程池的实现就是大名鼎鼎的Executor framework,Executor的出现减轻了很多Java开发者自己创建和管理线程的负担。

Thread和Executor的区别

前言中我们说过,Thread和Executor都是Java里用来并发执行一些code的,你可以通过继承java.lang.Thread类或者是实现java.lang.Runnable接口来实现,而Executor是一个接口,也提供了并发执行的能力,但是是通过线程池的形式,这对于大型Java应用来说更加适用,下面我们聊一下他们之间的区别:

  • Thread是一个类,Executor是一个接口;
  • Executor是并发计算的一个抽象,它允许代码以托管的方式运行,而Thread则是并发运行代码的一个具体实现;
  • Executor把任务本身和执行过程解耦,这在Thread是紧密结合在一起的;
  • Executor提供了一个executor方法接受一个Runnable对象,而Thread是在构造方法里传入一个Runnable对象,这里会造成一个问题,Executor可以执行不同类型的Runnable对象,而Thread不行,这是一个非常大的区别;

这么讲比较抽象,我们来看一个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ThreadAndExecutorTest {
public static void main(String[] args) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Task is executed by : "
+ Thread.currentThread().getName());
}
};
Thread t = new Thread(task, "MY_THREAD");
t.start();
Executor e = Executors.newSingleThreadExecutor();
e.execute(task);
}
}

输出:

1
2
Task is executed by : MY_THREAD
Task is executed by : pool-1-thread-1

这里可以看出几件事情: