运行一个线程实际上就是让Java虚拟机运行该线程的run方法,从而使相应线程的任务处理逻辑代码得以执行。因此,我们首先要启动线程(start方法)。启动一个线程的实质是请求java虚拟机运行相应的线程,而这个线程具体何时能够运行由线程调度器Schedule决定(操作系统相关)。因此,start方法结束,并不意味着线程开始,线程可能稍后运行,可能永远不会运行。

两种常见方式

Thread类有两个常见的构造器,Thread和Thread(Runable target),所以常见有两种方式使用线程

  1. 继承Thread类
    在子类的run方法中实现业务逻辑,调用时调用子类的start方法启动线程,不能直接调用run(),不然程序能够运行,但是线程启动不了。run()方法只能由虚拟机调用。
  2. 实现Runable接口
    跟继承类似,Runable接口里面只有一个run()方法,Thread里面将一些与run方法有关的参数封装成runable接口。