- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 如何使用Java實(shí)現多線(xiàn)程切換等待喚醒交替打印奇
這篇文章給大家分享的是有關(guān)如何使用Java實(shí)現多線(xiàn)程切換等待喚醒交替打印奇偶數的內容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
引言
在日常工作生活中,可能會(huì )有用時(shí)幾個(gè)人或是很多人干同一件事,在java編程中,同樣也會(huì )出現類(lèi)似的情況,多個(gè)線(xiàn)程干同樣一個(gè)活兒,比如火車(chē)站買(mǎi)票系統不能多個(gè)人買(mǎi)一到的是同一張票,當某個(gè)窗口(線(xiàn)程)在賣(mài)某一張票的時(shí)候,別的窗口(線(xiàn)程)不允許再賣(mài)此張票了,在此過(guò)程中涉及到一個(gè)鎖和資源等待的問(wèn)題,如何合理正確的讓線(xiàn)程與線(xiàn)程在干同一件事的過(guò)程中,不會(huì )搶資源以及一個(gè)一直等待一個(gè)一直干活的狀況,接下來(lái)就聊一下多線(xiàn)程的等待喚醒以及切換的過(guò)程,在此就以A和B兩個(gè)線(xiàn)程交替打印奇偶數的例子為例,代碼如下:
package com.svse.thread;import java.util.concurrent.atomic.AtomicInteger;/** * 交替打印奇偶數*功能說(shuō)明: *@author:zsq *create date:2019年5月27日 下午4:34:30 *修改人 修改時(shí)間 修改描述* *Copyright (c)2019北京智華天成科技有限公司-版權所有*/public class AlternatePrinting { //讓兩個(gè)線(xiàn)程使用同一把鎖。交替執行 。 //判斷是不是奇數 如果是奇數進(jìn)入奇數線(xiàn)程執行打印并加一。然后線(xiàn)程釋放鎖資源。然后讓該線(xiàn)程等待 //判斷是不是偶數,如果是偶數進(jìn)入偶數線(xiàn)程執行打印并加一。然后線(xiàn)程釋放鎖資源。然后讓該線(xiàn)程等待 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(); } //奇數線(xiàn)程 public static class AThread implements Runnable{ public void run() { while(true){ synchronized (atomicInteger) { if(atomicInteger.intValue()%2 !=0){ System.out.println("奇數線(xiàn)程:" + atomicInteger.intValue()); try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } atomicInteger.getAndIncrement(); // 以原子方式將當前值加 1。 // 奇數線(xiàn)程釋放鎖資源 atomicInteger.notify();//執行完操作后釋放鎖并進(jìn)入等待 try { atomicInteger.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ // 奇數線(xiàn)程等待 try { atomicInteger.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } //偶數線(xiàn)程 public static class BThread implements Runnable{ public void run() { while(true){ synchronized (atomicInteger) { if(atomicInteger.intValue()%2 ==0){ System.out.println("偶數線(xiàn)程:"+ atomicInteger.intValue()); try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } atomicInteger.getAndIncrement(); // 以原子方式將當前值加 1。 // 偶數線(xiàn)程釋放鎖資源 atomicInteger.notify();//執行完操作后釋放鎖并進(jìn)入等待 try { atomicInteger.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ try { // 偶數線(xiàn)程等待 atomicInteger.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } }}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站