完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
package test;
class MyThread implements Runnable
{
private int ticket = 1000;
public void run()
{
for (int i = 0; i < 1000; i++)
{
synchronized (this)
{
if (ticket > 0){
try{
Thread.sleep(1000);
}catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售票,剩余票数:" + ticket--);
}
}
}
}
}
public class Main
{
public static void main(String[] args)
{
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、线程的优先级
每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
2、Java 提供了三种创建线程的方法:
通过实现 Runnable 接口;
通过继承 Thread 类本身;
通过 Callable 和 Future 创建线程。
为了实现 Runnable,一个类只需要执行一个方法调用 run(),
public void run();
新线程创建之后,你调用它的 start() 方法它才会运行。
3、Thread类的常用方法
String getName() 返回该线程的名称。
void setName(String name) 改变线程名称,使之与参数 name 相同。
int getPriority() 返回线程的优先级。
void setPriority(int newPriority) 更改线程的优先级。
boolean isDaemon() 测试该线程是否为守护线程。
void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。
static void sleep(long millis)
void interrupt() 中断线程。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
void join() 等待该线程终止。
void run()
void start()
从Object类继承来的方法 void notify() void wait()