做一个练习:卖票小程序,实现数据共享。
我们先来创建线程,和主线程交替运行。
这个就比较简单了:
就以继承Thread类的方式来说吧:
class MyThread extends Thread { private int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } } } public class THREAD { public static void main (String[] args) { MyThread a = new MyThread("My"); MyThread b = new MyThread("Your"); a.start(); b.start(); } }
通过这个例子我们可以发现 num的值被重复打印,这与我们实际生活中的现象是不相符的,比如说:卖票。
火车站卖票的时候是多个窗口同时进行的,但是却没有发现有重复的票。
创建四个线程,相当于四个窗口来卖票:
class MyThread extends Thread { private int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } } } public class THREAD { public static void main (String[] args) { MyThread a = new MyThread("one"); MyThread b = new MyThread("two"); MyThread c = new MyThread("three"); MyThread d = new MyThread("four"); a.start(); b.start(); c.start(); d.start(); } }
但是运行结果显示,每张票都被重复卖了四次,如果现实生活中发生这种情况,那回家还有买不到票的?
如何解决。
将num变量声明为static的。
将数据定义成static 静态的,实现数据共享:
class MyThread extends Thread { private static int num = 150; private String name; public MyThread(String name) { super(name); } public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } } } public class THREAD { public static void main (String[] args) { MyThread a = new MyThread("one"); MyThread b = new MyThread("two"); MyThread c = new MyThread("three"); MyThread d = new MyThread("four"); a.start(); b.start(); c.start(); d.start(); } }
继承Thread类的方式已经实现数据共享,但是一般我们不定义静态的,因为静态的生命周期太长。
那么用实现Runnable接口方式又该怎么实现呢?
我们先用这种方式创建四个线程来实现线程的运行。
class MyThread implements Runnable { private static int num = 150; public void run () { while (num >= 0) { System.out.println(Thread.currentThread().getName()+"..."+num--); } } } public class THREAD { public static void main (String[] args) { MyThread a = new MyThread(); Thread a1 = new Thread(a); Thread a2 = new Thread(a); Thread a3 = new Thread(a); Thread a4 = new Thread(a); a1.start(); a2.start(); a3.start(); a4.start(); } }
一运行我们发现,卖票的程序已经实现了,已经实现数据共享了。这是怎么回事?
为什么用实现Runnable接口的方式就可以呢?
那么先来想一下这个问题:
为什么要将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数?
因为,自定义的run方法所属的对象是Runnable接口的子类对象,
而线程启动之后也要运行run方法,但是新 new 的Thread对象却没有复写run方法。
线程要运行必须要有run方法,但是自己却没有,所以要明确run方法所属的对象。就相当于借用的Runnable子类对象的run方法。
至此,卖票程序的两种方式已经实现。
原文地址:http://blog.csdn.net/u013476556/article/details/41902465