实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
源代码#
public class MyThread implements Runnable {
private static int tickets=1000;
public void run() {
for(int i=0;i<10000;i++) {
this.sale();
}
}
public synchronized void sale() {
if(tickets>0) {
System.out.println(Thread.currentThread().getName()+" "+"正在售出第"+tickets--+"张票");
System.out.println("售票成功!当前余票"+tickets+"张");
}
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my=new MyThread();
new Thread(my,"窗口一").start();
new Thread(my,"窗口二").start();
new Thread(my,"窗口三").start();
new Thread(my,"窗口四").start();
new Thread(my,"窗口五").start();
new Thread(my,"窗口六").start();
new Thread(my,"窗口七").start();
new Thread(my,"窗口八").start();
new Thread(my,"窗口九").start();
new Thread(my,"窗口十").start();
}
}
实验结果#
总结#
编程总结
本周作业在老师讲解之后变得比较简单 加上书上也有类似的题目 主要要了解最近两节课上讲的一些知识点 具体知识点在学习总结里面
学习总结
1.
如果要想正确的启动线程,是不能直接调用run()方法的,应该调用从Thread类中继承而来的start()方法,才可以启动线程。
mt1.start(); // 启动多线程
mt2.start(); // 启动多线程
3.线程操作的相关方法
4.synchronized的用法
•指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。
•直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
•直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。
5.
在Java中,使用1到10表示线程优先级。一般可以使用Thread内置的三个静态标量表示:
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
数字越大则优先级越高,但有效范围在1到10之间。下面的代码展示了优先级的作用。高优先级的线程倾向于更快地完成。
6.Thread类和Runnable接口的区别
实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。