java中Thread和Runnabel实现多线程是有所区别的,使用Runnable接口可以有效解决java中单继承带来的局限性。并且Thread类也是Runnable接口的子类: public class Thread extends Object implements Runnable
下面来通过一个利用多线程实现的买票小程序来了解一下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类去实现多线程就有点不合适了。