黑马程序员-关于线程继承Thread和Runnable的对比

来源:互联网 发布:最近破获网络涉枪案件 编辑:程序博客网 时间:2024/05/28 15:06
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------


创建线程的第一种方式,继承Thread类。

1 继承Thread类
2 重写run()方法
3 调用对象的start()方法。

调用线程对象的start(),就开启了线程,运行线程的run()方法,同时。如果直接执行线程对象的run()方法,那就是普通的对象调用方法,没有开启线程,主线程中按顺序执行代码而已,还是单线程。

class Demo3 extends Thread{private String name;Demo3(String name){this.name=name;}public void run(){for(int i=0;i<=60;i++){System.out.println(name+"Demo run--"+i);}}}public class ThreadDemo {public static void main(String[]args){Demo3 d=new Demo3("111111");Demo3 a=new Demo3("222222");d.start();a.start();for(int i=0;i<=60;i++){System.out.println("Main run------"+i);}}}


创建线程的第二种方式:实现Runable接口

1 定义类实现Runnable接口
2 覆盖Runnable接口中的run方法。将线程要运行的代码放入run方法中。
3 通过Thread类建立线程对象。
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去执行指定对象的 run方法。就必须明确该run方法所属对象。

5 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

下面用一个卖票的例子就能很清晰的看出二者的区别:

用Thread的:

class Ticket extends Thread{static private int tick=100;private String name;public Ticket(String name){this.name=name;}public void run(){while(true){if(tick>0){System.out.println(name+" sale: "+tick--);}}}}public class Maipiao {public static void main(String []args){Ticket t1=new Ticket("111");Ticket t2=new Ticket("222");Ticket t3=new Ticket("333");Ticket t4=new Ticket("444");t1.start();t2.start();t3.start();t4.start();}}
因为ticket是静态的,所以4个线程类共享这100个资源。因为是继承的Thread,所以只能看到1个线程,从100执行到1,一共执行了100次,其余3个不执行。如果ticket不是静态的,那么4个线程都会不间断的执行100次。

用Runnable的:

class Ticket implements Runnable{private int tick=100;Object obj=new Object();public void run(){while(true){synchronized(obj){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+" sale: "+tick--);}}}}}public class Maipiao{public static void main(String []args){Ticket t=new Ticket();Thread t1=new Thread(t);Thread t2=new Thread(t);Thread t3=new Thread(t);t1.start();t2.start();t3.start();}}

因为是继承了Runnable,所以4个线程并发执行这100个资源。

实现方式的好处:避免了单继承的局限性。建议使用实现方式。

两种方式的区别:继承Thread:线程代码放在Thread子类run方法。实现runnable,线程代码存在接口的子类run方法中。

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击