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

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

 

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

 

这个就比较简单了:

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


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

点击打开链接


你可能感兴趣的:(java,thread,多线程,线程)