多线程的数据共享

通过Runnable接口实现数据共享

下面通过模拟售票系统的一个小demo展示数据共享情况:

1.首先是一个实现了runnable接口的类,此类的成员变量票数ticketNum作为共享数据,因是成员变量,私有,所以此类不能new多个,只得通过new不同的Thread线程共用这一个对象。

/**
 * @author cuijiao TicketSys只能new一次,多个线程来用它,共享它的成员变量数据
 */
public class TicketSys implements Runnable {
    private int ticketNum = 10;// 成员变量

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (ticketNum > 0) {
            // 1.收钱
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // 2.售票
            System.out.println(Thread.currentThread().getName() + "sell ticket" + ticketNum);
            // 3.票数减少
            ticketNum--;
        }
    }

}

2.多个线程模拟售票窗口

/**
 * @author cuijiao
 *
 */
public class Demo1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TicketSys tc = new TicketSys();// 票务系统,只能new一次
        Thread th1 = new Thread(tc, "窗口1");// 窗口1
        Thread th2 = new Thread(tc, "窗口2");// 窗口2
        Thread th3 = new Thread(tc, "窗口3");// 窗口3
        th1.start();
        th2.start();
        th3.start();
    }

}

其中的某次运行结果如下:

接下来用CPU时间片调度分别对出现三次ticket=4和出现ticket=0,-1解释:

通过继承 Thread实现数据共享

主要利用内部类可访问外部类成员,使用内部类实现,运行结果及原因与上同,不赘述,仅贴出代码:

/**
 * @author cuijiao
 *
 *         内部类:只想在当前类使用,其他地方用不到的情况下 使用内部类,可以访问外部类的成员变量
 */
public class TicketSys {
    private int ticketNum = 10;// 成员变量

    private class Window extends Thread {
        public Window(String name) {
            super(name);
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (ticketNum > 0) {
                // 1.收钱
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // 2.售票
                System.out.println(Thread.currentThread().getName() + "sell ticket" + ticketNum);
                // 3.票数减少
                ticketNum--;
            }
        }

    }

    /**
     * 创建并启动线程
     *
     * @param name
     */
    public void openWindow(String name) {
        new Window(name).start();
    }
}

调用:

public class Demo1 {

 
    public static void main(String[] args) {
        TicketSys tc = new TicketSys();// 票务系统,只能new一次
        tc.openWindow("窗口1");// 每调用一次openWindow方法创建并启动一个新的线程
        tc.openWindow("窗口2");
        tc.openWindow("窗口3");
    }

}

猜你喜欢

转载自blog.csdn.net/qq_34777858/article/details/82856937