多线程 start 和 run 方法到底有什么区别?

472 阅读1分钟

  今天,详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者对这两个不是很理解的可以继续往下看。

  首先要知道实现多线程最基本的两种方式:

  其中 Thread 类也是实现了 Runnable 接口,而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。

  请注意,start() 方法被标识为 synchronized 的,即为了防止被多次启动的一个同步操作。

  那么你会问了,为什么要有两个方法,直接用一个 run() 方法不就行了吗!? 还真不行,如果直接调用 run() 方法,那就等于调用了一个普通的同步方法,达不到多线程运行的异步执行,来看下面的例子。

  public static void main(String[] args) {

  Thread thread = new Thread(() - {

  try {

  Thread.sleep(3000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  System.out.println(Java千锋);

  });

  long start = System.currentTimeMillis();

  thread.start();

  System.out.println(System.currentTimeMillis() - start);

  start = System.currentTimeMillis();

  thread.run();

  System.out.println(System.currentTimeMillis() - start);

  }

  程序输出:

  0

  Java千锋

  3000

  Java千锋

  从程序输出结果可以看出,启动 start 方法前后只用了 0 毫秒,而启动 run 方法则阻塞了 3000 毫秒等程序执行完再继续执行,这就是同步与异步的一个最重要的区别。

  看完这篇,你应该对 start 和 run 方法有了一个大概的掌握吧,再也不怕面试官问你这两个的区别了吧!