第一种方式
package offerPractical;
//火车站卖票系统,使用runnable接口创建
public class trainStation1 implements Runnable {
private static int ticket = 20;
// private Object lock="lock";
@Override
public void run() {
if (ticket > 0) {
while (ticket > 0) {
//当还有票的时候,要用同步锁,一个线程在抢票的时候,其他的线程不能访问
this.sale();
//每卖一次票就要给其他线程机会
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("所有车票已经售空");
}else {
System.out.println("所有车票已经售空");
}
}
private synchronized void sale() {
this.ticket= --ticket ;
System.out.println("通过" + Thread.currentThread().getName() + "购买到一张火车票" + "目前剩余" +ticket);
}
public static void main(String[] args) {
trainStation1 buy = new trainStation1();
Thread th1 = new Thread(buy, "智行火车票");
Thread th2 = new Thread(buy, "售票窗口");
th1.start();
th2.start();
}
}
第二种方式
package offerPractical;
//火车站卖票系统,使用继承线程类创建
public class trainStaion2 extends Thread{
private String name;
public static int ticket=5;
private Object lock="lock";
private trainStaion2(String name) {
this.name=name;
}
public void run() {
while (ticket>0) {
synchronized (lock) {
--ticket;
System.out.println("通过"+this.name+"买出1张,还剩下"+ticket+"张");
}
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
trainStaion2 t1=new trainStaion2("售票窗口");
trainStaion2 t2=new trainStaion2("智行app");
t1.start();
t2.start();
}
}
第三种方式
package offerPractical;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
//火车站卖票系统,使用callable接口创建
public class tranStation3 implements Callable<Integer>{
private String name;
private Object ob="lock";
private static int ticket=20;
protected tranStation3(String name){
this.name=name;
}
public static void main(String[] args) {
//开启两个线程
ExecutorService es = Executors.newFixedThreadPool(2);
tranStation3 t1 = new tranStation3("智行app");
tranStation3 t2 = new tranStation3("售票窗口");
Future<Integer> future1 = es.submit(t1);
Future<Integer> future2 = es.submit(t2);
es.shutdown();
}
@Override
public Integer call() throws Exception {
while (ticket>0) {
synchronized (ob) {
--ticket;
System.out.println("通过"+this.name+"卖出一张火车票,剩余"+ticket);
}
Thread.currentThread().sleep(300);
Thread.currentThread().yield();
}
return 1000;
}
}