实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
1.实验代码:
public class Mythread<tickets> implements Runnable { //实现Runnable接口
private int tickets=1000; //一共1000张票
private String name; //对窗口署名
public Mythread(String name){
this.name=name; //对name属性赋值
}
public void run() { //覆写run()方法
for(int i=0;i<1000;i++){ //超出票数的循环
synchronized (this){ //设置需要同步的操作
if(tickets>0){
try {
Thread.sleep(1000); //加入延迟 1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在售票...... 售票成功,剩余票:"+tickets--);
}
}
}
}
}
public class Test {
public static void main(String[] args) {
Mythread my=new Mythread(null); //定义线程对象并赋初值
Thread m1=new Thread(my,"售票口1");
Thread m2=new Thread(my,"售票口2");
Thread m3=new Thread(my,"售票口3");
Thread m4=new Thread(my,"售票口4");
Thread m5=new Thread(my,"售票口5");
Thread m6=new Thread(my,"售票口6");
Thread m7=new Thread(my,"售票口7");
Thread m8=new Thread(my,"售票口8");
Thread m9=new Thread(my,"售票口9");
Thread m10=new Thread(my,"售票口10"); //定义Thread对象
m1.start();
m2.start();
m3.start();
m4.start();
m5.start();
m6.start();
m7.start();
m8.start();
m9.start();
m10.start(); //启动线程
}
}
2.实验结果截图
实验总结:
这个实验老师上课的时候讲过,而且书上也有实例,我添加了一个name属性。我一开始也出现了卖负数票的情况,后面检查一下发现是自己输出那里有点问题,
改了一下就好了。
课程总结:
1.Java中线程的实现
方法一:继承Thread类
定义格式:
一个类只要继承了Thread类,就称为多线程操作类。且在Thread子类中,必须明确的覆写Thread类中的run()方法。
启动线程应调用start()方法。
方法二:实现Runnable接口
定义格式:
两种方法的区别:
Thread类中的run方法调用的是Runnable接口中的方法,故如果使用Thread方法实现多线程的话则必须要覆写run()方法。且
使用Runnable接口可以避免单继承局限,能更好的实现数据共享
两者结构比较:
线程的状态
线程分为五个状态,分别是创建状态,就绪状态,运行状态,堵塞状态和死亡状态。如图:
线程操作的一些相关方法:
自我总结:
这周学老师上课讲的时候听的不怎么懂,可是自己看书巩固了一下敲了一下代码,感觉还是可以吧!但还有些难题和问题待解决,
在后面的学习继续加油吧!!!!