java多線程之鐵路售票系統(tǒng)
更新時間:2019年07月13日 15:57:46 作者:beyond諺語
這篇文章主要為大家詳細介紹了java多線程之鐵路售票系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了java多線程之鐵路售票系統(tǒng)的具體代碼,供大家參考,具體內容如下
問題:鐵路售票,一共100張,通過四個窗口賣完。
要求:分別用
繼承Thread類 和 實現(xiàn)Runnable接口 去實現(xiàn)
①用繼承Thread類去實現(xiàn)
package com.yy.syn;
public class Demo3_Ticket {
/**
* 鐵路售票,一共100張,通過四個窗口賣完
* 用繼承Thread類去實現(xiàn)
* 分析:
* 四個窗口就相當于四條線程,100張火車票就相當于成員變量
*
* */
public static void main(String[] args) {
new Ticket().start(); //創(chuàng)建對象,第一條線程
new Ticket().start(); //創(chuàng)建對象,第二條線程
new Ticket().start(); //創(chuàng)建對象,第三條線程
new Ticket().start(); //創(chuàng)建對象,第四條線程
}
}
class Ticket extends Thread{ //繼承Thread類
private static int ticket = 100; //四條線程公用這100個成員變量
// private static Object obj = new Object(); //如果用引用數(shù)據類型的成員變量當作鎖對象,必須是靜態(tài)的,這里的obj對象應該設置為static靜態(tài)類型
public void run(){ //重寫run()方法
while(true){
synchronized (Ticket.class) { //這里應該變?yōu)閟ynchronized(obj){}
if(ticket <= 0){
break;
}
System.out.println(getName() + "...這是第" + ticket-- + "號票");
}
}
}
}
②用實現(xiàn)Runnable接口去實現(xiàn)
package com.yy.syn;
import java.security.GeneralSecurityException;
public class Demo4_Ticket {
/**
* 鐵路售票,一共100張,通過四個窗口賣完
* 用實現(xiàn)Runnable接口去實現(xiàn)
* 分析:
* 四個窗口就相當于四條線程,100張火車票就相當于成員變量
*
* */
public static void main(String[] args) {
MyTicket mt = new MyTicket(); //這里只是創(chuàng)建了一次對象
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
/*Thread t1 = new Thread(mt);
//public void start() 使該線程開始執(zhí)行;Java 虛擬機調用該線程的 run 方法。多次啟動一個線程是非法的。特別是當線程已經結束執(zhí)行后,不能再重新啟動。
t1.start();
t1.start();
t1.start();
t1.start();*/
}
}
class MyTicket implements Runnable{ //讓MyTicket這個類去實現(xiàn)Runnable這個接口
private int tickets = 100; //然后,Myticket類里面定義成員變量,這里的票只有100張
@Override
public void run() {
while(true){
synchronized (Ticket.class) { //這里的鎖對象也可以是this,即 synchronized (this),因為在主函數(shù)里面只創(chuàng)建了一次對象,這里的this就相當于主函數(shù)里面的mt
if(tickets <= 0){
break;
}
try{
Thread.sleep(10);
} catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...這是第" + tickets-- + "號票" );
} //不是Thread的子類,不能直接調用getName,需要Thread.currentThread().getName()
}
}
private String getName() {
return null;
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot封裝自己的Starter的實現(xiàn)方法
這篇文章主要介紹了SpringBoot封裝自己的Starter的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Spring?Cache+Redis緩存數(shù)據的實現(xiàn)示例
本文主要介紹了Spring?Cache+Redis緩存數(shù)據,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Spring boot+beetl+i18n國際化處理的方法
這篇文章主要介紹了Spring boot+beetl+i18n國際化處理的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

