java之学习多线程(二)
2015-08-28 14:35
477 查看
java中Thread和Runnabel实现多线程是有所区别的,使用Runnable接口可以有效解决java中单继承带来的局限性。并且Thread类也是Runnable接口的子类: public class Thread extends Object implements Runnable
下面来通过一个利用多线程实现的买票小程序来了解一下Thread和Runnable实现多线城市在对内存中数据操作的不同。
买票,ticket =5
买票,ticket =4
买票,ticket =3
买票,ticket =5
买票,ticket =5
买票,ticket =4
买票,ticket =3
买票,ticket =2
买票,ticket =1
买票,ticket =4
买票,ticket =2
买票,ticket =1
买票,ticket =3
买票,ticket =2
买票,ticket =1
Runnable 实现得到的结果:
........................................
Runnable 买票,ticket =5
Runnable 买票,ticket =4
Runnable 买票,ticket =3
Runnable 买票,ticket =2
Runnable 买票,ticket =1
由此我们可以得出结论:程序的本意为让三个售票窗口同时买网站上剩下的五张票,可是Thread实现中每张票都被买了五次,说明个线程各干各的活并没有达到同步数据,互相是独立的。所以Thread在这种买票的情况下用得出是错误的结果。Runnable 也是启动了三个线程对象,并且也达到了我们想要的结果。原因是这三个线程对象都占着同一个Runnable接口对象的引用,所以实现了数据共享的操做。所以我们在变成过程中,要考率实际情况来使用。
当然Thread也可以实现数据的共享,但是通过Thread类继承的多线程主体类再去利用Thread类去实现多线程就有点不合适了。
下面来通过一个利用多线程实现的买票小程序来了解一下Thread和Runnable实现多线城市在对内存中数据操作的不同。
public class Different_Thread_and_Runnable { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub t_hread t1 = new t_hread(); t_hread t2 = new t_hread(); t_hread t3 = new t_hread(); //t1.start(); //t2.start(); //t3.start();//Thread 多线程实现三个窗口一起买票 System.out.println("........................................"); r_unnable re = new r_unnable(); new Thread(re).start(); new Thread(re).start(); new Thread(re).start();//Runnable 多线程实现三个窗口一起买票。 } } //继承Thread 的多线程类 class t_hread extends Thread { private int ticket = 5; @Override public void run(){ for(int x = 0;x < 50;x++) { if(this.ticket >0) { System.out.println(" 买票,ticket ="+ this.ticket--); } } } } //实现 Runabel接口的多线程类 class r_unnable implements Runnable { private int ticket = 5; @Override public void run(){ for(int x = 0;x < 50;x++) { if(this.ticket >0) { System.out.println("Runnable 买票,ticket ="+ this.ticket--); } } } }Thread 实现得到的结果:
买票,ticket =5
买票,ticket =4
买票,ticket =3
买票,ticket =5
买票,ticket =5
买票,ticket =4
买票,ticket =3
买票,ticket =2
买票,ticket =1
买票,ticket =4
买票,ticket =2
买票,ticket =1
买票,ticket =3
买票,ticket =2
买票,ticket =1
Runnable 实现得到的结果:
........................................
Runnable 买票,ticket =5
Runnable 买票,ticket =4
Runnable 买票,ticket =3
Runnable 买票,ticket =2
Runnable 买票,ticket =1
由此我们可以得出结论:程序的本意为让三个售票窗口同时买网站上剩下的五张票,可是Thread实现中每张票都被买了五次,说明个线程各干各的活并没有达到同步数据,互相是独立的。所以Thread在这种买票的情况下用得出是错误的结果。Runnable 也是启动了三个线程对象,并且也达到了我们想要的结果。原因是这三个线程对象都占着同一个Runnable接口对象的引用,所以实现了数据共享的操做。所以我们在变成过程中,要考率实际情况来使用。
当然Thread也可以实现数据的共享,但是通过Thread类继承的多线程主体类再去利用Thread类去实现多线程就有点不合适了。
相关文章推荐
- Spring注解
- Java基础——Java对象的序列化和反序列化
- Eclipse 自动格式化问题
- 关于Java @Override 报错
- java中ThreadLocal类的使用
- JAVA泛型详解
- JAVA内存管理和GC机制
- spring4.1.0+spring mvc4.1.0+spring data jpa1.7.0+maven整合
- 【深入理解JAVA虚拟机】之运行时数据区域
- java之学习多线程(一)
- java反射机制初探
- MyEcplise 破解之道
- java正则表达式简单介绍
- 《 JAVA 核心技术 基础知识》 第五章 笔记
- 华为OJ-名字的漂亮程度(Java)
- java-Date、String、Calendar转化
- Java字符串的10大热点问题盘点
- 用JAVA接口声明一个变量是什么意思?
- eclipse的Android项目不能运行
- java中&和&&的区别