//在多线程的处理中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,于是当多个线程
//访问统一资源的时候如果处理不当就会产生数据的错误操作。
//模拟一个卖票程序,将创建若干个线程对象实现卖票的处理操作。
package cn.pjy.demo;
//在多线程的处理中,可以利用Runnable描述多个线程操作的资源,而Thread描述每一个线程对象,于是当多个线程
//访问统一资源的时候如果处理不当就会产生数据的错误操作。
//模拟一个卖票程序,将创建若干个线程对象实现卖票的处理操作。
class MyThread6 implements Runnable{
private int ticket = 10; //总票数为10张
@Override
public void run() {
while(true) {
if(this.ticket > 0) {
try {
Thread.sleep(100); //模拟网络延迟
//可以发现卖票中出现了负数的情况
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票, ticket = " + this.ticket --);
}else {
System.out.println("*********** 已售空 ***********");
break;
}
}
}
}
public class ThreadDemo6 {
public static void main(String[] args) {
MyThread6 mt = new MyThread6();
new Thread(mt, "票贩子A").start();
new Thread(mt, "票贩子B").start();
new Thread(mt, "票贩子C").start();
}
//此时的程序将创建三个程序线程,并且三个线程对象将进行5张票的出售,此时的程序进行卖票处理的时候并没有任何的问题,但这只是一种假象
//模拟卖票中的延迟操作。
}
卖票处理:
在线程中的数据错误问题,就需要使用线程同步来解决。