实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
package 实验七; public class MyThread implements Runnable { public MyThread(String name, int time){ } public MyThread() { // TODO Auto-generated constructor stub } private int ticket=1000; private boolean flag=true; public void run() { while(flag) { try { Thread.sleep(1); }catch(Exception e) { e.printStackTrace(); } test(); } } public synchronized void test() { if(ticket<=0){ flag=false; return; } try{ Thread.sleep(1); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在卖出第" + (1001-ticket) + "张车票,剩余"+(ticket-1)+"张票"); --ticket; } }
package 实验七; public class Text{ public static void main(String[] args) { MyThread mt=new MyThread(); Thread t1=new Thread(mt,"卖票窗口1"); Thread t2=new Thread(mt,"卖票窗口2"); Thread t3=new Thread(mt,"卖票窗口3"); Thread t4=new Thread(mt,"卖票窗口4"); Thread t5=new Thread(mt,"卖票窗口5"); Thread t6=new Thread(mt,"卖票窗口6"); Thread t7=new Thread(mt,"卖票窗口7"); Thread t8=new Thread(mt,"卖票窗口8"); Thread t9=new Thread(mt,"卖票窗口9"); Thread t10=new Thread(mt,"卖票窗口10"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); t7.start(); t8.start(); t9.start(); t10.start(); } }
实验结果:
错误截图:
正确截图:
实验总结:这次作业老师上课讲过,书上也有例子,所以做起来是比较容易的,但是难免会出现一点问题,像我的就没一次性实现需求,主要部分大致和书上的一样,但是就是没出现随机多窗口售票,顶多就一两个窗口在卖票,和谢思敏遇到的问题差不多吧。问了下他,在run方法里面多加了一个延迟,然后创建了一个新的test方法来控制判断售票情况,得到的结果就满足题目需求了。
学习总结:
实现多线程:
通过继承class Thread或实现Runnable接口,我们可以实现多线程。
1. 通过继承class Thread实现多线程,class Thread中有两个最重要的函数run()和start()。run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。
2.如果有一个类,它已继承了某个类,又想实现多线程,那就可以通过实现Runnable接口来实现。
Runnable接口只有一个run()函数。
把一个实现了Runnable接口的对象作为参数产生一个Thread对象,再调用Thread对象的start()函数就可执行并行操作。
2. 通过synchronized实现资源同步
synchronized 关键字可以在整个class下进行锁定,避免static数据的同时访问。
JAVA IO
目前我们学习的是File类,使用File类可以进行创建或删除文件等常用操作。
注意:在使用该类时,必须向该类的构造方法中传递一个文件路径。
不同操作系统的路径分隔符也是不同的,windows的是“”,Linux的是“/”。
所有的操作是由JAVA虚拟机进行的,所以会出现一定的延迟,所以在进行文件操作时要考虑延迟的影响。
File类中的主要方法和常量