线程的实现方式

  1. 实现Runnable接口
  1. public class RunnableThread implements Runnable {
  2. @Override
  3. public void run() {
  4. System.out.println("用实现Runnable接口实现线程");
  5. }
  6. }
  1. 继承Thread
  1. public class ExtendsThread extends Thread {
  2. @Override
  3. public void run() {
  4. System.out.println("用Thread类实现线程");
  5. }
  6. }
  1. 线程池创建线程

创建线程池设置多个子线程,就会有多个子线程来实现线程创建,默认通过实现线程工厂DefaultThreadFactory来创建线程,并设置一些默认值,本质还是通过new Thread()创建线程。

  1. ExecutorService service = Executors.newFixedThreadPool(10);
  1. 有返回值的Callable创建线程
  1. public class CallableTask implements Callable<Integer> {
  2. @Override
  3. public Integer call() throws Exception {
  4. return new Random().nextInt();
  5. }
  6. }
  7. // 创建线程池
  8. ExecutorService service = Executors.newFixedThreadPool(10);
  9. // 提交任务,返回结果
  10. Future<Integer> submit = service.submit(new CallableTask());

线程的本质

创建线程只有一种方式:构造Thread类

实现线程运行内容的方式的两种方式

  • 方法一:实现Runnable接口重写run()方法,并把Runnable实例作为target对象,传给Thread类,最终调用target.run()

  • 方式二:继承Thread类,重写Threadrun()方法,Thread.start()最终会执行run()方法

实现方式的选择

实现Runnable接口要比继承Thread类要更好

  • 可以把不同的内容进行解耦,权责分明
  • 某些情况下可以提升性能,减小开销
  • 继承Thread类相当于限制了代码的扩展性