Java---12---多线程练习:卖票---实现数据共享

来源:互联网 发布:伦敦银交易软件 编辑:程序博客网 时间:2024/06/10 04:20

做一个练习:卖票小程序,实现数据共享。

 

我们先来创建线程,和主线程交替运行。

 

这个就比较简单了:

就以继承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方法。


至此,卖票程序的两种方式已经实现。

点击打开链接


1 2
原创粉丝点击