Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)
引言
在日常工作生活中,可能會(huì)有用時(shí)幾個(gè)人或是很多人干同一件事,在java編程中,同樣也會(huì)出現(xiàn)類(lèi)似的情況,多個(gè)線程干同樣一個(gè)活兒,比如火車(chē)站買(mǎi)票系統(tǒng)不能多個(gè)人買(mǎi)一到的是同一張票,當(dāng)某個(gè)窗口(線程)在賣(mài)某一張票的時(shí)候,別的窗口(線程)不允許再賣(mài)此張票了,在此過(guò)程中涉及到一個(gè)鎖和資源等待的問(wèn)題,如何合理正確的讓線程與線程在干同一件事的過(guò)程中,不會(huì)搶資源以及一個(gè)一直等待一個(gè)一直干活的狀況,接下來(lái)就聊一下多線程的等待喚醒以及切換的過(guò)程,在此就以A和B兩個(gè)線程交替打印奇偶數(shù)的例子為例,代碼如下:
package com.svse.thread; import java.util.concurrent.atomic.AtomicInteger; /** * 交替打印奇偶數(shù) *功能說(shuō)明: *@author:zsq *create date:2019年5月27日 下午4:34:30 *修改人 修改時(shí)間 修改描述 * *Copyright (c)2019北京智華天成科技有限公司-版權(quán)所有 */ public class AlternatePrinting { //讓兩個(gè)線程使用同一把鎖。交替執(zhí)行 。 //判斷是不是奇數(shù) 如果是奇數(shù)進(jìn)入奇數(shù)線程執(zhí)行打印并加一。然后線程釋放鎖資源。然后讓該線程等待 //判斷是不是偶數(shù),如果是偶數(shù)進(jìn)入偶數(shù)線程執(zhí)行打印并加一。然后線程釋放鎖資源。然后讓該線程等待 public static AtomicInteger atomicInteger =new AtomicInteger(1); public static void main(String[] args) { Thread a=new Thread(new AThread()); Thread b=new Thread(new BThread()); a.start(); b.start(); } //奇數(shù)線程 public static class AThread implements Runnable{ public void run() { while(true){ synchronized (atomicInteger) { if(atomicInteger.intValue()%2 !=0){ System.out.println("奇數(shù)線程:" + atomicInteger.intValue()); try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } atomicInteger.getAndIncrement(); // 以原子方式將當(dāng)前值加 1。 // 奇數(shù)線程釋放鎖資源 atomicInteger.notify();//執(zhí)行完操作后釋放鎖并進(jìn)入等待 try { atomicInteger.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ // 奇數(shù)線程等待 try { atomicInteger.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } //偶數(shù)線程 public static class BThread implements Runnable{ public void run() { while(true){ synchronized (atomicInteger) { if(atomicInteger.intValue()%2 ==0){ System.out.println("偶數(shù)線程:"+ atomicInteger.intValue()); try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } atomicInteger.getAndIncrement(); // 以原子方式將當(dāng)前值加 1。 // 偶數(shù)線程釋放鎖資源 atomicInteger.notify();//執(zhí)行完操作后釋放鎖并進(jìn)入等待 try { atomicInteger.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ try { // 偶數(shù)線程等待 atomicInteger.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } }
效果如下:
總結(jié)
以上所述是小編給大家介紹的Java 實(shí)現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Java采用循環(huán)鏈表結(jié)構(gòu)求解約瑟夫問(wèn)題
這篇文章主要介紹了Java采用循環(huán)鏈表結(jié)構(gòu)求解約瑟夫問(wèn)題的解決方法,是很多Java面試環(huán)節(jié)都會(huì)遇到的經(jīng)典考題,這里詳細(xì)給出了約瑟夫問(wèn)題的原理及Java解決方法,是非常經(jīng)典的應(yīng)用實(shí)例,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12Spring Boot2中如何優(yōu)雅地個(gè)性化定制Jackson實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot2中如何優(yōu)雅地個(gè)性化定制Jackson實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05淺談SpringMVC請(qǐng)求映射handler源碼解讀
這篇文章主要介紹了淺談SpringMVC請(qǐng)求映射handler源碼解讀,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03springboot自帶的緩存@EnableCaching用法
這篇文章主要介紹了springboot自帶的緩存@EnableCaching用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Java垃圾回收機(jī)制的finalize方法實(shí)例分析
這篇文章主要介紹了Java垃圾回收機(jī)制的finalize方法,結(jié)合實(shí)例形式分析了finalize方法的特點(diǎn)及在垃圾回收機(jī)制中的相關(guān)操作技巧,需要的朋友可以參考下2019-08-08MyBatis快速入門(mén)(簡(jiǎn)明淺析易懂)
MyBatis是支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。mybatis的學(xué)習(xí)是程序員的必修課。今天小編通過(guò)分享本教程幫助大家快速入門(mén)mybatis,對(duì)mybatis入門(mén)知識(shí)感興趣的朋友參考下吧2016-11-11