博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 实现多线程切换等待唤醒交替打印奇偶数
阅读量:7100 次
发布时间:2019-06-28

本文共 2778 字,大约阅读时间需要 9 分钟。

引言

     在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在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();
        }
       }
      }
    }
    }
  }
}

 效果如下:

       

 

转载于:https://www.cnblogs.com/zhaosq/p/10931071.html

你可能感兴趣的文章
vSphere 6.0 -Difference between vSphere 5.0, 5.1, 5.5 and vSphere 6.0
查看>>
Collect VMware support log&Performance Snapshot
查看>>
Enable PowerShell script execution policy
查看>>
aix 设置主机信任
查看>>
编程题:输入一串字符,程序会自动将大写字母转换为小写
查看>>
js赋值时特殊字符完美处理方案
查看>>
Linux基础之文本查看命令(cat,tac,rev,head,tail,more,less)
查看>>
同一表中重复数据处理
查看>>
Mail、计划任务
查看>>
yii框架中model映射数据库中不存在的表,做请求转发的接口
查看>>
我的友情链接
查看>>
RHEL6下YUM安装源的配置
查看>>
轻松搞定面试中的链表题目
查看>>
利用google-authenticator给SSH加密
查看>>
asp.net 多个空格转成一个空格
查看>>
Apache与Tomcat集群配置例子(Windowx下)-网摘
查看>>
50 个WIN8技巧
查看>>
Yarn简单介绍及内存配置
查看>>
Exchange安装 Windows Management Framework
查看>>
Linux远程连接windows桌面和screen后台虚拟终端进程管理
查看>>