Demo14_售票程序

package test05;

public class Demo14_售票程序 {

public static void main(String[] args) {

//创建Runnable接口的子类对象
ticket t = new ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
// Thread t3 = new Thread(t);
// Thread t4 = new Thread(t);//线程在创建时没有运行
t1.start();//开启时运行
t2.start();
// t3.start();
// t4.start();
}

}
/*
*实现多个人同时售票
*
*售票的动作需要同时执行,所以使用多线程技术
*
*
*多线程的安全问题 错误数据 -1 -2
*
*问题产生的原因
*1.多个线程在操作共享数据
*2.线程任务操作共享数据的代码有多条(运算有多个)
*
*解决思路
*只要让一个线程在执行线程任务是将多条操作共享数据的代码执行完,只要执行过程中不要让其他线程参与运算
*
*代码怎么体现呢?
*将判断语句与try catch 语句 封装起来
*Java代码中解决此问题用代码块完成 称之为 同步代码块 synchronized
*格式 。
*synchronized(对象)
*{
* //需要被同步的代码
*}
*
*同步代码块解决了代码的安全性问题
*弊端 降低了程序 效率
*
*前提
*必须保证多个线程在同步时使用同一个锁
*解决了当多线程发生问题时,加入了同步后,问题依旧
*就要通过这个同步的前提来判断同步是否书写正确
*/
class ticket implements Runnable
{
//1.定义票的总数量
int tickets = 10 ;
private Object obj = new Object();
//2.售票的动作,这个动作会被多线程执行,那就是线程任务代码,需要定义在run方法中
//线程任务中一般有循环结构
@Override
public void run() {
while(true)
{
synchronized(obj)
{
if( tickets > 0 )
{
//要让线程在这里等候,模拟问题的发生。 sleep 方法 出现 -1 -2 等错误数据,这就是多线程的安全问题
//静态方法直接 类名.方法 直接调用
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();//处理方式
}
System.out.println(Thread.currentThread().getName()+”……”+tickets–);//得知那张票是谁卖出的线程名字从Thread_0开始
}
}
}
}
}

猜你喜欢

转载自blog.csdn.net/mingxu_W/article/details/81608476
今日推荐