酷站(www.ku0.com)-致力于为互联网从业者提供动力!

热门关键词:  企业  as  baidu  c4rp3nt3r  美女
【阿里云】采购季上云仅¥223/3年

Java 实现多线程切换等待唤醒交替打印奇偶数的方法

来源:互联网搜集 作者:秩名 人气: 发布时间:2019-05-30
本篇文章主要介绍了Java 实现多线程切换等待唤醒交替打印奇偶数的方法,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

本篇文章介绍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();
        }
       }
     }
    }
  }
 }
}

效果如下:



版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://www.cnblogs.com/zhaosq/archive/2019/05/29/10931071.html

相关文章

  • Mybatis版本升级踩坑及背后原理的介绍

    Mybatis版本升级踩坑及背后原理的介绍

    1、背景 某一天的晚上,系统服务正在进行常规需求的上线,因为发布时,提示统一的pom版本需要升级,于是从 1.3.9.6 升级至 1.4.2.1。 当服务开始上线后,开始陆续出现了一些更新系统交互日志方面的报警,属于系统辅助流程,报警下图所示,......
    05-17
  • SpringBoot使用Redis实现分布式锁的方法

    SpringBoot使用Redis实现分布式锁的方法

    前言 在单机应用时代,我们对一个共享的对象进行多线程访问的时候,使用java的synchronized关键字或者ReentrantLock类对操作的对象加锁就可以解决对象的线程安全问题。 分布式应用时代这个方法却行不通了,我们的应用可能被部署到多台机......
    05-16
  • System.currentTimeMillis()计算方式与时间的单位转换

    System.currentTimeMillis()计算方式与时间的单位转换

    一、时间的单位转换 1秒=1000毫秒(ms)1毫秒=1/1,000秒(s) 1秒=1,000,000微秒(s)1微秒=1/1,000,000秒(s) 1秒=1,000,000,000纳秒(ns)1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000皮秒(ps)1皮秒=1/1,000,000,000,000秒(s) 1分钟=6......
    05-15
  • java中构造器内部调用构造器的介绍

    java中构造器内部调用构造器的介绍

    可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点。 public class Flower { private String string; private int age; public Flower() { // 先调用public Flo......
    05-10
  • JMETER用户变量作用域测试流程

    JMETER用户变量作用域测试流程

    在编写JMETER 脚本时,我们会使用到变量,变量的作用域是线程。 我们通过下面的脚本验证一下变量的返回是线程。 1. 我们先定义一个amount的流程变量。 2.线程组使用三个线程 3.在线程组中添加一个循环控制器,执行次数为3. 增加一个循环......
    05-09
  • 为什么SpringBoot的jar可以直接运行?

    为什么SpringBoot的jar可以直接运行?

    SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可: build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId ......
    05-09
  • Springmvc和ajax实现前后端交互

    Springmvc和ajax实现前后端交互

    springmvc使用@RequestBody来获取前端的json字符串并转化为java对象 使用@ReponseBody来将返回的java对象转换为json形式返回前端 下面是几个使用springmvc和ajax进行前后端交互的简单实例 1.传递简单对象: 前端: $(function(){ $(#btn3......
    05-06
  • Spring替换掉默认common-logging.jar的方法

    Spring替换掉默认common-logging.jar的方法

    为什么使用日志打印而不是使用System.out.println()? System.out是一个io流 如果使用它打印大批量数据 会占用大量的资源 spring默认使用common-logging打印日志信息 如果我们想替换掉它 使用其他的日志工具 分为如下几步 1.排除项目对co......
    05-06
  • 将ResultSet中得到的一行或多行结果集封装成对象

    将ResultSet中得到的一行或多行结果集封装成对象

    首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。 public class BaseDa......
    05-03
  • Java Lock锁多线程中实现流水线任务的介绍

    Java Lock锁多线程中实现流水线任务的介绍

    下面程序代码通过使用Lock锁执行简单的流水线任务: import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * @author lzq * @data 2020/4/29 002......
    05-01

最新更新