1. 程式人生 > 其它 >6.18Java多執行緒同步方法實現DemoNo2

6.18Java多執行緒同步方法實現DemoNo2

6.18Java多執行緒同步方法實現DemoNo2

使用同步方法重寫購票demo

package iostudy.synchro;

/**
* 模擬買火車票
*/
public class Happy12306 {
public static void main(String[] args) {

/*例項化資源類*/
Web12306 web12306 = new Web12306(4, "Happy!");

/*例項化代理物件*/
new Passenger(2, web12306, "Jun").start();
new Passenger(1, web12306, "Harden").start();

}
}

/**
* 建立乘客資源類
*/
class Passenger extends Thread{

/*設定資源*/
int seats;

public Passenger(int seats, Runnable target, String name){
super(target, name);
this.seats = seats;
}
}

/**
* 另一個資源類
*/
class Web12306 implements Runnable{

/*設定資源*/
int available;
String name;

/*構造器*/
public Web12306(int available, String name){
this.available = available;
this.name = name;
}

/**
* 重寫run方法,思考如何獲得引數
*/
public void run(){
/*通過強制轉型的方法拿到seats的值*/
Passenger p = (Passenger) Thread.currentThread();
boolean flag = this.bookTickets(p.seats);
if (flag){
System.out.println("出票成功!" + Thread.currentThread().getName()
+ "位置為" + p.seats);
}else {
System.out.println("出票失敗" + Thread.currentThread().getName()
+ "位置不夠!!");
}
}

/**
* 購買方法
*/
public synchronized boolean bookTickets(int seats){
System.out.println("可用位置為:" + available);
if (seats>available){
return false;
}

available -= seats;
return true;

}
}
梳理
  • 需要使用同步方法保證資料安全

  • 怎麼與乘客互動?

    • 乘客繼承Thread類

      • 好處:可以在子類當中+執行緒變數

    • 延續父類的構造器,進行型別強制轉型

  • 拿到結果