实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验源码:
package ash;
public class MyThread implements Runnable{
private int ticket=1000;
public void run() {
for(int i=0;i<=1000;i++) {
synchronized(this) {
if(ticket>0) {
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"剩余票数:"+ticket--);
}
}
}
}
}
package ash;
public class Test {
public static void main(String args[]) {
MyThread my=new MyThread();
new Thread(my,"1窗口").start();
new Thread(my,"2窗口").start();
new Thread(my,"3窗口").start();
new Thread(my,"4窗口").start();
new Thread(my,"5窗口").start();
new Thread(my,"6窗口").start();
new Thread(my,"7窗口").start();
new Thread(my,"8窗口").start();
new Thread(my,"9窗口").start();
new Thread(my,"10窗口").start();
}
}
实验结果:
实验过程:
首先利用runnable接口实现多线程,达到资源共享的目的。本题涉及到几个线程操作的相关方法:1.利用getname()方法设置线程的名称。2.直接使用Thread.sleep()方法进行延时一秒的操作。3.为避免产生负数情况,使用同步代码块(synchronize(同步对象){ })解决同步问题。
课程总结:
Thread类(不能被资源共享)与Runnable接口(可以资源共享):
两者都可以实现多线程,Thread类是Runnable接口的子类,但Thread类没有完全实现Runnable接口中的run()方法。
线程操作的相关方法:
①:取得和设置线程名称(getName());
②:判断线程是否启动(isAlive());
③:线程的强制运行(jion());
④:线程的休眠(Thread.sleep());
⑤:中断线程(interrupt());
⑥:后台线程(setDaemon());
⑦:线程的优先级。哪个线程的优先级高,哪个线程就有可能会先被执行;
⑧:线程的礼让(yield())。
同步与死锁
①:使用同步代码块或者同步方法进行同步;
②:过多的同步会产生死锁。
学习总结:
老师这周布置的作业看来是用心良苦啊。这个题目是老师上课讲的,而且书上都有的。之所以让我们做,原因有三。一、希望我们能有改进优化增加的部分。二、根据作业判断上课成效,同学有没有听进去。三、上周有些抄袭让老师心塞了,所以不为难大家,如果还有人继续照搬他人的,老师以后会改变“政策”吧。