1.继承Thread类,定义Thread类的子类,并重写该类的run方法(该方法体就代表了线性要完成的任务,因此把run方法成为执行体),创建了Thread子类的实例,即创建了线程对象;
2.实现Runnable接口,定义了Runnable接口的实现类,并重写该接口的run()方法,该run()方法体同样是该线程的线程执行体,创建Runnnable实现类的实例,并以此实例作为Thread构造方法的参数来创建Thread对象,该对象才是真正的线程对象,调用线程对象的star()方法来启动该线程。但是比继承Thread类好用,实现接口还可以继承其他父类,提高了代码的复用性,避免了单继承带来的局限性,在这种方式下,多个线程可以共享同一个runnable对象,所以非常适合多个相同线程来处理同一份资源的情况;
3.实现callable接口,重写call()方法,有返回值;
4.使用实现了Executor接口的ThreadPoolExecutor来创建线性池。