实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
package demo; class MyThread implements Runnable{ private int ticket = 1000; public void run() { for (int i=0;i<100;i++){ synchronized (this){ if (ticket>0){ try { Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"售票:ticket="+ticket--); } } } } } public class test { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt,"窗口1").start(); new Thread(mt,"窗口2").start(); new Thread(mt,"窗口3").start(); new Thread(mt,"窗口4").start(); new Thread(mt,"窗口5").start(); new Thread(mt,"窗口6").start(); new Thread(mt,"窗口7").start(); new Thread(mt,"窗口8").start(); new Thread(mt,"窗口9").start(); new Thread(mt,"窗口10").start(); } }
结果截图:
实验总结:
这个题老师上课讲过,书上也有类似的代码,还算比较简单。就是有一个小瑕疵,总是连续一个窗口卖票,也不知道是cpu的问题还是什么。
课程总结:
1)多线程继承Tread类:
class 类名称 extends Thread{ 属性***; 方法***; public void run(){ 线程主体; } }
2)Rnunable接口实现多线程:
class 类名称 implements Runnable{ 属性***; 方法***; public void run(){ 线程主体; } }
3)synchronized
(1)指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。
(2)直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
(3)直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。