多线程实现的三种方式:
1、继承Thread类
是一个支持多线程的功能类,只要一个子类继承就可以实现多线程。在对Thread类进行深入理解之前,我们必须要知道:所有程序的起点是 main() 方法,所有线程也应该有自己的起点,这个起点就是 run() 方法。在多线程的每个主体类中都必须覆写Thread类中所提供的run()方法。
细心点可以发现,Thread类中的 public void run() 方法没有返回值,即线程一旦开始运行就要一直进行下去,不返回内容。
看个例子:
此程序正常运行,但线程和进程是一样的,当出现多个线程时,就要轮流抢占资源,即多个线程要交替运行(启动多线程的标志)。此程序直接调用run()方法,并不能启动多线程。而启动多线程唯一的方法是 Thread类 中的 start() 方法。
注:调用public void start()执行的方法体是run()定义的。
那为什么启动多线程用start()而不是run()呢?
通过start()方法的源码可以发现,其中有重复启动线程判断(抛出 IllegalThreadStateException() 异常),之后调用start0() 方法,这个方法有什么用呢?
java开发里面有一门叫JNI(java Native Interface)的技术,使用本机操作系统提供的函数,而这项技术不能离开特定的操作系统。
你想啊,要线程能执行,就需要线程所在操作系统为其分配资源,而start()方法中的start0()就相当于拥有JVM的功能,即能自动为不同操作系统启动多线程分配资源。
所以,Thread类中的start()方法不仅能启动多线程,还能自动为不同操作系统启动多线程分配资源。
2、实现Runnable接口(线程起点是run()方法,不变的)
接口一摆出来,其实它的优势就出来了,就Thread类而言,虽然可以在主体类中实现了多线程的定义,但java由于单继承性,所以Thread类创建线程具有局限性。但是!但是!要想启动多线程,必须依靠Thread类来完成,因为Runnable没有start()方法。Thread类中定义了public Thread(Runnable target)构造方法来接收Runnable接口对象(即也能接收子类对象)。
public class TestDemo { //主类
public static void main(String[ ]args) {
MyThread mt1 = new MyThread("线程A") ;
MyThread mt2 = new MyThread( "线程B") ;
MyThread mt3 = pew MyThread("线程C") ;
new Thread(mt1).start();//关键性的一步
new Thread(mt1).start();
new Thread(mt1).start();
}
}