继承Thread类

1
2
3
4
5
6
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}

实现Runnable接口

1
2
3
4
5
6
class MyThread implements Runnable {
@Override
public void run() {

}
}

实现Callable接口

1
2
3
4
5
6
class MyThread2 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return null;
}
}

总结

相比于继承 Thread 类,通过 Runnable 接口实现多线程的优势:

  • 任务与线程解耦合,提高代码的健壮性
  • 避免了 Java 单继承的弊端,防止因为继承其他类而无法继承 Thread 类
  • 在使用线程池时,只能传入 Runnable 或 Callable 类型的对象,不能传入 Thread 类型的对象

相比于前两种创建线程的方式,线程池的优势:

  • 降低资源消耗,线程可以多次利用,降低线程创建和销毁的开销
  • 提高响应速度,线程池已经提前创建好线程,免去线程创建的时间
  • 方便对线程的管理,例如:可以设定线程的最大容量,防止服务器因线程过多的而崩溃

参考文献