java多線程模擬搶紅包功能
今天有朋友問(wèn)我一道面試題,有5個(gè)人搶5個(gè)紅包,可重復(fù)搶,用多線程程序?qū)崿F(xiàn),實(shí)現(xiàn)方式有多種,分享一下我的思路:應(yīng)用了阻塞隊(duì)列的特性。
/**
* Created by zhanglinqiang on 2016/6/23.
*/
public class MyTest {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<LuckyMoney> luckyMoneys = new LinkedBlockingQueue<>();
List<FutureTask> futureTasks = new ArrayList<>();
//準(zhǔn)備搶紅包
for (int i = 0; i < 5; i++) {
FutureTask<Object> futureTask = new FutureTask<>(new CatchLuckMoney(luckyMoneys, "name" + i), null);
new Thread(futureTask,"name"+i).start();
futureTasks.add(futureTask);
}
Thread.sleep(5);//確保搶紅包線程準(zhǔn)備就緒
Random random = new Random(100);
//發(fā)5個(gè)紅包
for (int i = 0; i < 5; i++) {
luckyMoneys.put(new LuckyMoney("紅包"+i, random.nextInt(100)+1));
}
//等到紅包搶完
while (!luckyMoneys.isEmpty()){
Thread.sleep(1);
}
//終止搶紅包線程
for (FutureTask futureTask : futureTasks) {
futureTask.cancel(true);
}
}
}
class CatchLuckMoney implements Runnable {
public CatchLuckMoney(LinkedBlockingQueue<LuckyMoney> luckyMoneys, String name) {
this.luckyMoneys = luckyMoneys;
this.name = name;
}
private LinkedBlockingQueue<LuckyMoney> luckyMoneys;
private String name;
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
LuckyMoney redPackage = null;
try {
redPackage = luckyMoneys.take();
} catch (InterruptedException e) {
// e.printStackTrace();
break;
}
System.out.println(name + "搶到了-->" + redPackage);
luckyMoneys.remove(redPackage);
}
System.out.println("end>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+Thread.currentThread().getName());
}
}
class LuckyMoney {
public LuckyMoney(String name, Integer money) {
this.name = name;
this.money = money;
}
private String name;
private Integer money;
@Override
public String toString() {
return "LuckyMoney{" +
"name='" + name + '\'' +
", money=" + money +
'}';
}
}
運(yùn)行效果:
Connected to the target VM, address: '127.0.0.1:8869', transport: 'socket'
name3搶到了-->LuckyMoney{name='紅包0', money=16}
name4搶到了-->LuckyMoney{name='紅包3', money=89}
name0搶到了-->LuckyMoney{name='紅包2', money=75}
name1搶到了-->LuckyMoney{name='紅包1', money=51}
name3搶到了-->LuckyMoney{name='紅包4', money=92}
end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name0
end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name4
end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name3
Disconnected from the target VM, address: '127.0.0.1:8869', transport: 'socket'
end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name1
end>>>>>>>>>>>>>>>>>>>>>>>>>>>>name2
Process finished with exit code 0
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb學(xué)習(xí)筆記之Filter和Listener
這篇文章主要給大家介紹了關(guān)于JavaWeb學(xué)習(xí)筆記之Filter和Listener的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證
在后端開(kāi)發(fā)中,參數(shù)校驗(yàn)是非常普遍的,下面這篇文章主要給大家介紹了關(guān)于Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
Java深入了解數(shù)據(jù)結(jié)構(gòu)中常見(jiàn)的排序算法
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開(kāi)發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō)Java常見(jiàn)的排序算法,需要的朋友可以參考一下2022-01-01
JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲
這篇文章主要為大家詳細(xì)介紹了JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn)
這篇文章主要介紹了IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
這么優(yōu)雅的Java ORM沒(méi)見(jiàn)過(guò)吧!
這篇文章主要介紹了Java ORM的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01
SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)分頁(yè)接口的詳細(xì)教程
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,在SpringBoot項(xiàng)目中使用MyBatis-Plus可以大大簡(jiǎn)化分頁(yè)邏輯的編寫(xiě),本文將介紹如何在 SpringBoot項(xiàng)目中使用MyBatis-Plus實(shí)現(xiàn)分頁(yè)接口2024-03-03
springboot 設(shè)置server.port不生效的原因及解決
這篇文章主要介紹了springboot 設(shè)置server.port不生效的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

