十二、Thread和Runnable区别

it2022-05-08  8

Thread和Runnable的区别 如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。 main函数,实例化线程对象也有所不同, extends Thread :t.start(); implements Runnable : new Thread(t).start(); 总结:

实现implements Runnable接口比继承 extends Thread类所具有的优势: 1):适合多个相同的程序代码的线程去处理同一个资源 2):可以避免java中的单继承的限制(不能访问父类的私有成员?) 3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立 4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类 为什么这么说类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享:举个卖票的例子: 以卖票程序为例,通过Thread类完成:

package org.demo.dff;class MyThread extends Thread{private int ticket=10;public void run(){for(int i=0;i<20;i++){if(this.ticket>0){System.out.println(“卖票:ticket”+this.ticket–);}}}}; 下面通过三个线程对象,同时卖票:package org.demo.dff;public class ThreadTicket {public static void main(String[] args) {MyThread mt1=new MyThread();MyThread mt2=new MyThread();MyThread mt3=new MyThread();mt1.start();//每个线程都各卖了10张,共卖了30张票mt2.start();//但实际只有10张票,每个线程都卖自己的票mt3.start();//没有达到资源共享}} 如果用Runnable就可以实现资源共享,下面看例子:package org.demo.runnable;class MyThread implements Runnable{private int ticket=10;public void run(){for(int i=0;i<20;i++){if(this.ticket>0){System.out.println(“卖票:ticket”+this.ticket–);}}}}package org.demo.runnable;public class RunnableTicket {public static void main(String[] args) {MyThread mt=new MyThread();new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一new Thread(mt).start();//个实例化对象mt,就会出现异常new Thread(mt).start();}}; 虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

最新回复(0)