第九周课程总结&实验报告(七)
实验报告
完成火车站售票程序的模拟。
要求:
(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决定。