hpe实训课(多线程3)

模拟火车站售票程序,开启三个窗口售票(1,2,3) 100张票

使用继承的方式来实现

class Window extends Thread{
	// 总票数
	static int ticket = 100;
	@Override
	public void run() {
		while (true) {
			if (ticket > 0) {
				// 打印票号,并且维护计数器
				System.out.println(Thread.currentThread().getName()+"售票,票号:"+ticket --);
			}else {
				// 票已抢完
				break;
			}
		}
	}
}
public class TestWindow {
	public static void main(String[] args) {
		// 开去三个售票窗口
		Window w1 = new Window();
		Window w2 = new Window();
		Window w3 = new Window();
		
		// 设置窗口名称
		w1.setName("窗口1");
		w2.setName("窗口2");
		w3.setName("窗口3");
		
		// 启动售票
		w1.start();
		w2.start();
		w3.start();

		
	}
}

使用实现的方式来实现

class Window1 implements Runnable{
	// 总票数
	int ticket = 100;
	@Override
	public void run() {
		while (true) {
			if (ticket > 0) {
				// 打印票号,并且维护计数器
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"售票,票号:"+ticket --);
			}else {
				// 票已抢完
				break;
			}
		}
	}
	
}
public class TestWindow1 {
	public static void main(String[] args) {
		Window1 p = new Window1();
		Thread t1 = new Thread(p);
		Thread t2 = new Thread(p);
		Thread t3 = new Thread(p);
		
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		
		t1.start();
		t2.start();
		t3.start();

		
		
	}
}

两种方法都引发的问题:此程序存在线程安全问题(重票、错票)

原因:由于一个线程在操作共享数据的过程中,为执行完毕,另外的子线程此时参与进来,导致共享数据出现线程安全问题。
解决方案
需要采用线程的同步机制

发布了30 篇原创文章 · 获赞 0 · 访问量 1946

猜你喜欢

转载自blog.csdn.net/qq_38499019/article/details/104561703