第九周课程总结&实验报告(七)
实验七 实验报告(七)
实验任务详情:
一、完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
package 第九周;
public class Xiancheng implements Runnable
{
private int ticket = 999; // 1000张票
public void run()
{
for (int i = 0; i < 1000; i++)
{
synchronized (this) // 对象同步
{
if (ticket >= 0)
{
if (ticket == 0)
{
System.out.println(Thread.currentThread().getName() + "已售罄");
break;
}
else
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "成功卖出一张票,剩余 : " + ticket--);
}
}
}
}
}
}
package 第九周;
public class Train
{
public static void main(String args[])
{
Xiancheng my = new Xiancheng();
Thread d1 = new Thread(my, "窗口伊");
Thread d2 = new Thread(my, "窗口饿");
Thread d3 = new Thread(my, "窗口三");
Thread d4 = new Thread(my, "窗口寺");
Thread d5 = new Thread(my, "窗口伍");
Thread d6 = new Thread(my, "窗口翏");
Thread d7 = new Thread(my, "窗口漆");
Thread d8 = new Thread(my, "窗口芭");
Thread d9 = new Thread(my, "窗口鹫");
Thread d0 = new Thread(my, "窗口式");
d4.setPriority(Thread.MIN_PRIORITY); // 优先级 最低
d5.setPriority(Thread.MAX_PRIORITY); // 优先级 最高
d6.setPriority(Thread.NORM_PRIORITY); // 优先级 中等
d1.start(); // 同步启动线程
d2.start();
d3.start();
d4.start();
d5.start();
d6.start();
d7.start();
d8.start();
d9.start();
d0.start();
}
}
实验分析:
错误:根据书本258页仿写,遇到的问题暂无;需要注意之处,使用方法setPriority设置优先级的大小写格式等。
总结:需使用同步的方法解决以上问题,不同步程序不会报错,但没有了实际意义。
正确截图:
课堂学习总结
一、本周复习了两个重要的多线程的类Thread和Runnable;再是学习了Callable接口实现多线程,该接口可实现返回操作数据,最后是线程的状态,了解了5种线程状态以及线程状态的转换过程,还有各种关于线程已有的方法;本周的作业即实验题目可以按照书上的来写,改一些内容,触类旁通,理解了各部分功能即能调节个参数,达到解题的目的。
二、Callable接口中Future Task类的常用方法:
三、线程操作的主要方法:
四、优先级概述:
- 在 Java 语言中,线程的优先级范围是 1~10,值必须在 1~10,否则会出现异常;优先级的默认值为 5。优先级较高的线程会被优先执行,当执行完毕,才会轮到优先级较低的线程执行。如果优先级相同,那么就采用轮流执行的方式。
- 主线程有可能比其他线程先执行完。
- 可以使用 Thread 类中的 setPriority() 方法来设置线程的优先级。
- 如果要获取当前线程的优先级,可以直接调用 getPriority() 方法。