/**
- 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
- 思路:
- ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;
- ② 在Ticket类中重写run()方法实现卖票,代码步骤如下
- A:判断票数大于0,就卖票,并告知是哪个窗口卖的
- B:票数要减1 C:卖光之后,线程停止
- ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下
- A:创建Ticket类的对象
- B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称
- C:启动线程
*/
使用synchronized同步代码块实现
票类
package com.llb.卖票.my;
/**
* 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
* 思路:
* ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;
* ② 在Ticket类中重写run()方法实现卖票,代码步骤如下
* A:判断票数大于0,就卖票,并告知是哪个窗口卖的
* B:票数要减1 C:卖光之后,线程停止
* ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下
* A:创建Ticket类的对象
* B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称
* C:启动线程
*/
public class Ticket extends Thread {
private int ticketCount = 100;
// private Object o
@Override
public void run() {
while (true){
synchronized (this){
if (ticketCount>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticketCount--;
System.out.println(Thread.currentThread().getName()
+"在卖"+(ticketCount+1)+"号票,还剩"
+ticketCount+"张票");
}else {
break;
}
}
}
}
}
main
package com.llb.卖票.my;
public class TicketDemo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread thread1 = new Thread(ticket);
Thread thread2 = new Thread(ticket);
Thread thread3 = new Thread(ticket);
thread1.setName("窗口1---");
thread2.setName("窗口2---");
thread3.setName("窗口3---");
thread1.start();
thread2.start();
thread3.start();
}
}
使用synchronized同步方法实现
票类
package com.llb.卖票.my.同步方法;
/**
* 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
* 思路:
* ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:private int ticketCount = 100;
* ② 在Ticket类中重写run()方法实现卖票,代码步骤如下
* A:判断票数大于0,就卖票,并告知是哪个窗口卖的
* B:票数要减1 C:卖光之后,线程停止
* ③ 定义一个测试类TicketDemo,里面有main方法,代码步骤如下
* A:创建Ticket类的对象
* B:创建三个Thread类的对象,把Ticket对象作为构造方法的参数,并给出对应的窗口名称
* C:启动线程
*/
public class Ticket implements Runnable {
private static int ticket = 100;
@Override
public void run() {
while (true){
// method();
method2();
}
}
// 同步方法
// 同步锁是this
private synchronized void method(){
if (ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
System.out.println(Thread.currentThread().getName()
+"在卖"+(ticket+1)+"号票,还剩"
+ticket+"张票");
}
}
// 同步方法
//同步锁是Ticket.class,当前类的字节码对象
private static synchronized void method2(){
if (ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
System.out.println(Thread.currentThread().getName()
+"在卖"+(ticket+1)+"号票,还剩"
+ticket+"张票");
}
}
}
main
package com.llb.卖票.my.同步方法;
import com.llb.卖票.my.Ticket;
public class TicketDemo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread thread1 = new Thread(ticket);
Thread thread2 = new Thread(ticket);
Thread thread3 = new Thread(ticket);
thread1.setName("窗口1---");
thread2.setName("窗口2---");
thread3.setName("窗口3---");
thread1.start();
thread2.start();
thread3.start();
}
}