多线程的数据共享
通过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");
}
}