黑马程序员-关于线程继承Thread和Runnable的对比
来源:互联网 发布:最近破获网络涉枪案件 编辑:程序博客网 时间:2024/05/28 15:06
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
2 重写run()方法
3 调用对象的start()方法。
2 覆盖Runnable接口中的run方法。将线程要运行的代码放入run方法中。
3 通过Thread类建立线程对象。
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去执行指定对象的 run方法。就必须明确该run方法所属对象。
---------------------- 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
- 黑马程序员-关于线程继承Thread和Runnable的对比
- 黑马程序员-线程Thread类和Runnable接口
- 继承Thread类和实现Runnable接口的对比
- 黑马程序员_多线程技术_(线程的创建 Thread和Runnable、死锁、线程间通信、join、yield)
- 黑马程序员--基础加强--第四篇--继承Thread类和实现Runnable接口有什么区别?
- 继承thread和实现runnable的区别
- 线程(Thread) 和 Runnable
- Java线程示例 - 继承Thread类和实现Runnable接口
- 创建线程继承Thread和实现Runnable接口
- 源码分析继承Thread和实现Runnable来创建线程
- java线程---Runnable和Thread的区别
- Java线程-Runnable和Thread的区别
- java线程---Runnable和Thread的区别
- Java 线程 Runnable和Thread的区别
- 线程Thread和Runnable的区别
- 线程的创建:实现Runnable接口和继承Thread类,(倒计时的实现)
- java中的通过继承Thread和实现Runnable接口实现的线程
- JAVA 线程的两种基本实现方法(继承Thread类和实现Runnable接口)
- 对比多张图片的灰阶
- AIR程序生成系统托盘
- 如何写出百度非常青睐的文章?
- Android TextView 高级应用
- oracle goldengate 参数学习 GETUPDATEBEFORES
- 黑马程序员-关于线程继承Thread和Runnable的对比
- 最长上升子序列--poj2533、poj3903、hdu1025
- 同一页面多次使用kindEditor的上传文件——兼容大部分浏览器
- JPA 常用操作 与 Hibernate 的区别
- Vuzix的M100安卓智能眼镜和Google Glass不同
- sql语句中insert into 表中 select多个值后插入数据
- No enclosing instance of type ChuangKou is accessible. Must qualify the allocation with an enclosing
- 不只是技术!成为IT经理必备的十大软技能
- 在Windows XP和Windows 7系统上安装.NET Framework 3.5框架