Java 實現多線程切換等待喚醒交替打印奇偶數


引言

     在日常工作生活中,可能會有用時幾個人或是很多人干同一件事,在java編程中,同樣也會出現類似的情況,多個線程干同樣一個活兒,比如火車站買票系統不能多個人買一到的是同一張票,當某個窗口(線程)在賣某一張票的時候,別的窗口(線程)不允許再賣此張票了,在此過程中涉及到一個鎖和資源等待的問題,如何合理正確的讓線程與線程在干同一件事的過程中,不會搶資源以及一個一直等待一個一直干活的狀況,接下來就聊一下多線程的等待喚醒以及切換的過程,在此就以A和B兩個線程交替打印奇偶數的例子為例,代碼如下:

package com.svse.thread;
import java.util.concurrent.atomic.AtomicInteger;

/**
* 交替打印奇偶數
*功能說明:
*@author:zsq
*create date:2019年5月27日 下午4:34:30
*修改人 修改時間 修改描述
*
*Copyright (c)2019北京智華天成科技有限公司-版權所有
*/
public class AlternatePrinting {

  //讓兩個線程使用同一把鎖。交替執行 。
  //判斷是不是奇數 如果是奇數進入奇數線程執行打印並加一。然后線程釋放鎖資源。然后讓該線程等待
  //判斷是不是偶數,如果是偶數進入偶數線程執行打印並加一。然后線程釋放鎖資源。然后讓該線程等待
  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();
  }

  //奇數線程
  public static class AThread implements Runnable{
    public void run() {
      while(true){
        synchronized (atomicInteger) {
        if(atomicInteger.intValue()%2 !=0){
          System.out.println("奇數線程:" + atomicInteger.intValue());
          try {
            Thread.sleep(500);
          } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
          }
          atomicInteger.getAndIncrement(); // 以原子方式將當前值加 1。
          // 奇數線程釋放鎖資源
          atomicInteger.notify();//執行完操作后釋放鎖並進入等待
          try {
            atomicInteger.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }else{
          // 奇數線程等待
          try {
            atomicInteger.wait();
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      }
     }
    }
  }

 
   //偶數線程
  public static class BThread implements Runnable{
    public void run() {
      while(true){
       synchronized (atomicInteger) {
       if(atomicInteger.intValue()%2 ==0){
          System.out.println("偶數線程:"+ atomicInteger.intValue());
          try {
            Thread.sleep(500);
          } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
          }
        atomicInteger.getAndIncrement(); // 以原子方式將當前值加 1。
        // 偶數線程釋放鎖資源
        atomicInteger.notify();//執行完操作后釋放鎖並進入等待
        try {
          atomicInteger.wait();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }else{
        try {
          // 偶數線程等待
          atomicInteger.wait();
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
       }
      }
    }
    }
  }
}

 效果如下:

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM