线程----模拟售票
1.用extends继承来实现多线程
package cn.aust.pro;
/**
*@author 作者:aoxixi
*@version 时间:2021年7月13日下午2:19:05
*@desc 描述:线程——模拟售票 -----多线程并发问题1
*/
public class Demo04 extends Thread{
//现有的票---10张
private int ticket = 10;
@Override
public void run()
{
while(true) {
if(ticket<=0) {
break;
}
System.out.println("线程:"+Thread.currentThread().getName()
+"剩余的票:"+ ticket--);
}
}
public static void main(String[] args) {
//创建线程---三个售票窗口
Demo04 obj1 = new Demo04();
Demo04 obj2 = new Demo04();
Demo04 obj3 = new Demo04();
Thread thread1 = new Thread(obj1,"窗口1");
Thread thread2 = new Thread(obj2,"窗口2");
Thread thread3 = new Thread(obj3,"窗口3");
thread1.start();
thread2.start();
thread3.start();
}
}
此代码运行结果出现多线程并发问题。可能三个窗口出现抢票现象,即同时卖出同一张票的。
2.用implements实现多线程
package cn.aust.pro;
/**
*@author 作者:aoxixi
*@version 时间:2021年7月13日下午2:40:48
*@desc 描述:线程的实现方法2----实现Runnable接口
* 多线程并发问题2
*/
public class Demo05 implements Runnable{
private int ticket = 10;
@Override
public void run() {
while(true) {
if(ticket<=0) {
break;
}
try {
Thread.sleep(100);//休眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()
+"剩余的票:"+ ticket--);
}
}
public static void main(String[] args) {
Demo05 obj = new Demo05();
Thread t1 = new Thread(obj,"窗口1");
Thread t2 = new Thread(obj,"窗口2");
Thread t3 = new Thread(obj,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
该代码也会出现多线程并发问题。为了解决此问题,用对象锁解决此问题。
package cn.aust.pro;
/**
*@author 作者:aoxixi
*@version 时间:2021年7月13日下午3:11:07
*@desc 描述:多线程并发问题的解决---对象锁
*/
public class Demo06 extends Thread{
//现有的票---10张
private int ticket = 10;
@Override
public void run()
{
while(true) {
synchronized(this) {//对象锁
if(ticket<=0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()
+"剩余的票:"+ ticket--);
}
}
}
public static void main(String[] args) {
Thread obj = new Demo06();
for(int i=0;i<3;i++)
{
new Thread(obj).start();
}
}
}