• 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();
            }
           }
          }
        }
        }
      }
    }

     效果如下:

           

  • 相关阅读:
    SpringMVC文件上传
    c函数调用过程原理及函数栈帧分析
    《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花
    Java学习笔记——IO操作之以图片地址下载图片
    uva 400 Unix ls 文件输出排版 排序题
    【VC++积累】之八、PreTranslageMessage;TranslageMessage;GetMessage和PeekMessage的区别
    uva 331 Mapping the Swaps 求交换排序的map 纯DFS
    uva 10344 23 out of 5 凑运算结果 全排列+dfs
    Java学习笔记——File类文件管理及IO读写、复制操作
    uva 301 Transportation 铁路公司的阳谋 纯dfs暴力
  • 原文地址:https://www.cnblogs.com/zhaosq/p/10931071.html
Copyright © 2020-2023  润新知