实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
//会出现每个线程都卖1000张票的情况,因为对象不唯一会导致每个线程对象都有一份独立的成员属性;
class MyThread implements Runnable{
private int ticket = 1000;
public void run() {
for (int i=0;i<2000;i++) {
synchronized (this) {
if (ticket>0) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"售票:ticket = " + ticket--);
}
}
}
}
};
public class practice1 {
public static void main (String args[]) {
MyThread my = new MyThread();
Thread my1 = new Thread(my);
my1.setName("窗口1");
Thread my2 = new Thread(my);
my2.setName("窗口2");
Thread my3 = new Thread(my);
my3.setName("窗口3");
Thread my4 = new Thread(my);
my4.setName("窗口4");
Thread my5 = new Thread(my);
my5.setName("窗口5");
Thread my6 = new Thread(my);
my6.setName("窗口6");
Thread my7 = new Thread(my);
my7.setName("窗口7");
Thread my8 = new Thread(my);
my8.setName("窗口8");
Thread my9 = new Thread(my);
my9.setName("窗口9");
Thread my10 = new Thread(my);
my10.setName("窗口10");
my1.start();
my2.start();
my3.start();
my4.start();
my5.start();
my6.start();
my7.start();
my8.start();
my9.start();
my10.start();
}
}
本周总结
线程操作:注意方法
//线程的休眠
在线程中允许一个线程进行暂时的休眠,直接使用Thread.sleep()方法即可。
sleep()–线程休眠
sleep()方法是Thread类中的一个静态方法,需要一个用于指定该线程休眠的时间,该时间以毫秒为单位。
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static --- 说明可以由Thread类名称调用。
Throws ---表示如果有异常要在调用此方法处处理异常。所以sleep()方法要有InterruptedException 异常处理,而且sleep()调用方法通常为Thread.sleep(500) ;形式。
创建线程的另一种方法是实现Runnable接口。Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表
该类是一个“线程”类,不能直接运行,必须通过Thread实例才能创建并运行线程。
Runnable接口
定义实现Runnable接口的类,并实现该类中的run()方法。
建立一个Thread对象,并将实现的Runnable接口的类的对象作为参数传入Thread类的构造方法。
通过Thread类中的start()方法启动线程,并运行。
注:直接调用Thread类或Runnable类对象的run()方法是无法启动线程的,这只是一个简单的方法调用必须通过Thread方法中的start()才行。//