java实现对线程编程的方式主要有两种,一种是继承Thread,一种是Runnable接口。
线程的启动并不是简单的调用了run方法,而是由一个线程调度器来分别调用所有线程的run方法。如果直接调用Thread实例的run方法,则不能起到多线程的作用,因为它会在当前运行的线程中执行,而不是启动一个新的线程去执行。线程里的run方法只有一定的CPU时间,执行过后就给别的线程了,这样反复的被CPU切来切去。
而start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
Runnable接口和Thread之间的联系:
public classThread extendsObject implementsRunnable
看源码可以发现Thread类也是Runnable接口的子类。
Runnable接口和Thread之间的区别:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
关于资源共享参照卖票的例子。
以卖票程序为例,通过Thread类完成:
classMyThread extendsThread{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
下面通过三个线程对象,同时卖票:
public class ThreadTicket {
public static void main(String[] args) {
MyThread mt1=newMyThread();
MyThread mt2=newMyThread();
MyThread mt3=newMyThread();
mt1.start();//每个线程都各卖了10张,共卖了30张票
mt2.start();//但实际只有10张票,每个线程都卖自己的票
mt3.start();//没有达到资源共享
}
}
如果用Runnable就可以实现资源共享,下面看例子:
class MyThread implements Runnable{
private intt icket=10;
public void run(){
for(inti=0;i<20;i++){
if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
}
Run类
public class RunnableTicket {
public static void main(String[] args) {
MyThread mt=newMyThread();
newThread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
newThread(mt).start();//个实例化对象mt,就会出现异常
newThread(mt).start();
}
}
虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。