java之多線程搶火車票的實現(xiàn)示例
一、創(chuàng)建線程的方法是實現(xiàn)runnable,重寫run方法,執(zhí)行線程需要丟入runnable接口實現(xiàn)類,調(diào)用start方法
*********************************/
//多個線程同時操作一個類
//火車票
public class TestTread4 implements Runnable{
//票數(shù)
private int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums <= 0) {
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"張票");
}
}
public static void main(String[] args) {
TestTread4 testTread4 = new TestTread4();
new Thread(testTread4, "小明").start();
new Thread(testTread4,"老師").start();
new Thread(testTread4,"黃牛").start();
}
}
發(fā)現(xiàn)問題:多個線程操作同一個資源的情況下,線程不安全,數(shù)據(jù)紊亂.

加上鎖就搞定
public class TestTread4 implements Runnable{
//票數(shù)
private int ticketNums = 10;
@Override
public synchronized void run() {
while (true) {
if (ticketNums <= 0) {
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"張票");
}
}
public static void main(String[] args) {
TestTread4 testTread4 = new TestTread4();
new Thread(testTread4, "小明").start();
new Thread(testTread4,"老師").start();
new Thread(testTread4,"黃牛").start();
}
}
當(dāng)有200人搶100張票
public class TicketRunnable implements Runnable {
/**
* 總票數(shù)
*/
private final int ticketSize = 100;
/**
* 搶票人數(shù)
*/
private final int peopleSize = 200;
/**
* 票數(shù)
*/
private int ticketNum;
/**
* 人數(shù)
*/
private int peopleNum;
@Override
public void run() {
while(ticketNum < ticketSize && peopleNum < peopleSize){
synchronized (this){
if(ticketNum < ticketSize && peopleNum < peopleSize){
if((int)(Math.random() * 20) % 2 == 1){
System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + "個人搶到第" + (++ticketNum) + " 張票");
try {
Thread.sleep(100);
}catch (Exception e){
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + " 個人未搶到票");
}
}
}
}
}
}
public class TestTicket {
public static void main(String[] args) {
TicketRunnable tr = new TicketRunnable();
Thread t1 = new Thread(tr , "窗口A");
Thread t2 = new Thread(tr , "窗口B");
Thread t3 = new Thread(tr , "窗口C");
Thread t4 = new Thread(tr , "窗口D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}到此這篇關(guān)于java之多線程搶火車票的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)java 多線程搶火車票內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決程序啟動報錯org.springframework.context.ApplicationContextExcept
文章描述了一個Spring Boot項目在不同環(huán)境下啟動時出現(xiàn)差異的問題,通過分析報錯信息,發(fā)現(xiàn)是由于導(dǎo)入`spring-boot-starter-tomcat`依賴時定義的scope導(dǎo)致的配置問題,調(diào)整依賴導(dǎo)入配置后,解決了啟動錯誤2024-11-11
java線程中斷?interrupt?和?LockSupport解析
這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
關(guān)于springcloud集成nacos遇到的問題
這篇文章主要介紹了關(guān)于springcloud集成nacos遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Elasticsearch進行深度分頁的詳細指南(避免踩坑+報錯)
這篇文章主要為大家詳細介紹了使用Elasticsearch進行深度分頁時會員踩的坑以及報錯的相關(guān)解決方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04

