第九周课程总结&实验报告(七)

实验报告

完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。

代码


public class Mythread implements Runnable {

	private int ticket = 1000;
	
	public void run() {
		
		for(int i=0;ticket>0;)
		{
			synchronized(this){
				if(ticket>0) {
					try {
						Thread.sleep(1000);
					}catch(InterruptedException ie) {
						//ie.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"卖出第"+ticket+"张票");
					ticket--;
				}
			}
		}
	}

}
测试

public class Test {

	public static void main(String[] args) {
		Mythread t1 = new Mythread();
		
		
		new Thread(t1,"1窗口").start();
		new Thread(t1,"2窗口").start();
		new Thread(t1,"3窗口").start();
		new Thread(t1,"4窗口").start();
		new Thread(t1,"5窗口").start();
		new Thread(t1,"6窗口").start();
		new Thread(t1,"7窗口").start();
		new Thread(t1,"8窗口").start();
		new Thread(t1,"9窗口").start();
		new Thread(t1,"10窗口").start();
	}

}

遇到的问题

1.输出的同一张票重复的情况;

解决办法:run()方法中的输出中把票的计数改为用ticket计数。
2.没有显示每个线程的名称;

解决办法:在run()方法的输出中调用Thread.currentThread().getName(),在main()方法中启动线程时可以给线程命名。

运行结果





学习总结

线程的一些主要方法;
取得和设置线程的名称:取得名称用Thread.currentThread().getName(),手工设置线程名称是在启动线程时new Thread(对象名称,"线程名称").start();
中断线程:在一个线程运行时,另一个线程可以直接通过interrupt()方法中断其运行状态;
同步:在多个线程操作同一资源时,有可能出现资源的同步问题,使用“同步代码块”或“同步方法”来避免;
同步代码块:

synchronized(同步对象){
       //需要同步的代码
}

同步方法:

synchronized 方法返回值 方法名称(参数列表){
   //方法体
}

File类
File类的构造方法:
public File(String pathname); 实例化File类的时候,必须设置好路径
File类的主要操作方法:
File类的常量:pathSeparator表示; separator表示\
RandomAccessFile类的常用操作方法;

注意:

1.主方法实际上也是一个线程;
2.在java运行时至少会启动两个线程:一个是main线程,另一个是垃圾收集线程;
3.在调用yield()方法做线程礼让时,会将当前线程暂停一下,让其它线程进行,但是是否会礼让成功,由CPU决定。

posted @ 2019-10-25 23:14  LeeMayZ  阅读(100)  评论(1编辑  收藏  举报