赵纾寻  
a special world

实验任务详情:

完成火车站售票程序的模拟。
要求:
(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())。

同步与死锁

①:使用同步代码块或者同步方法进行同步;
②:过多的同步会产生死锁。

学习总结:

老师这周布置的作业看来是用心良苦啊。这个题目是老师上课讲的,而且书上都有的。之所以让我们做,原因有三。一、希望我们能有改进优化增加的部分。二、根据作业判断上课成效,同学有没有听进去。三、上周有些抄袭让老师心塞了,所以不为难大家,如果还有人继续照搬他人的,老师以后会改变“政策”吧。

posted on 2019-10-25 00:35  赵纾寻  阅读(167)  评论(0编辑  收藏  举报