java实现两个线程交替打印的实例代码

 更新时间:2019年12月25日 08:45:58   作者:V  
在本篇文章里小编给大家整理的是一篇关于java实现两个线程交替打印的相关知识点内容,有需要的朋友们参考下。

使用ReentrantLock实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;

 

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

public class Demo2 {

 private static Lock lock = new ReentrantLock();

 private static Condition c1 = lock.newCondition();

 private static Condition c2 = lock.newCondition();

 private static CountDownLatch count = new CountDownLatch(1);

 public static void main(String[] args) {

  String c = "ABCDEFGHI";

  char[] ca = c.toCharArray();

  String n = "123456789";

  char[] na = n.toCharArray();

  Thread t1 = new Thread(() -> {

   try {

    lock.lock();

    count.countDown();

    for(char caa : ca) {

     c1.signal();

     System.out.print(caa);

     c2.await();

    }

    c1.signal();

   } catch (InterruptedException e) {

    e.printStackTrace();

   } finally {

    lock.unlock();

   }

  });

  Thread t2 = new Thread(() -> {

   try {

    count.await();

    lock.lock();

    for(char naa : na) {

     c2.signal();

     System.out.print(naa);

     c1.await();

    }

    c2.signal();

   } catch (InterruptedException e) {

    e.printStackTrace();

   } finally {

    lock.unlock();

   }

  });

  t1.start();

  t2.start();

 }

}

最后输出结果:

使用LinkedTransferQueue实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;

 

 

import java.util.concurrent.LinkedTransferQueue;

 

public class Demo3 {

 private static LinkedTransferQueue<Character> linkedC = new LinkedTransferQueue<Character>();

 private static LinkedTransferQueue<Character> linkedN = new LinkedTransferQueue<Character>();

 public static void main(String[] args) {

  String c = "ABCDEFGHI";

  char[] ca = c.toCharArray();

  String n = "123456789";

  char[] na = n.toCharArray();

  Thread t1 = new Thread(() -> {

   for(char caa : ca) {

    try {

     linkedC.put(caa);

     char a = linkedN.take();

     System.out.print(a);

    } catch (InterruptedException e) {

     e.printStackTrace();

    }

   }

  });

  Thread t2 = new Thread(() -> {

   for(char naa : na) {

    try {

     char b = linkedC.take();

     System.out.print(b);

     linkedN.put(naa);

    } catch (InterruptedException e) {

     e.printStackTrace();

    }

   }

  });

  t1.start();

  t2.start();

 

 }

}

输出结果:

使用synchronized实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;

 

 

import java.util.concurrent.CountDownLatch;

 

public class Demo4 {

 private static CountDownLatch count = new CountDownLatch(1);

 public static void main(String[] args) {

  String c = "ABCDEFGHI";

  char[] ca = c.toCharArray();

  String n = "123456789";

  char[] na = n.toCharArray();

  Object lock = new Object();

  Thread t1 = new Thread(() -> {

   synchronized (lock) {

    count.countDown();

    for(char caa : ca) {

     System.out.print(caa);

     lock.notify();

     try {

      lock.wait();

     } catch (InterruptedException e) {

      e.printStackTrace();

     }

    }

    lock.notify();

   }

  });

  Thread t2 = new Thread(() -> {

   try {

    count.await();

   } catch (InterruptedException e) {

    e.printStackTrace();

   }

   synchronized (lock) {

    for(char naa : na) {

     System.out.print(naa);

     lock.notify();

     try {

      lock.wait();

     } catch (InterruptedException e) {

      e.printStackTrace();

     }

    }

    lock.notify();

   }

  });

  t1.start();

  t2.start();

 }

}

输出结果:

使用LockSupport实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;

 

 

import java.util.concurrent.locks.LockSupport;

 

public class Demo5 {

 private static Thread t1;

 private static Thread t2;

 public static void main(String[] args) {

  String c = "ABCDEFGHI";

  char[] ca = c.toCharArray();

  String n = "123456789";

  char[] na = n.toCharArray();

  t1 = new Thread(() -> {

   for(char caa : ca) {

    System.out.print(caa);

    LockSupport.unpark(t2);

    LockSupport.park();

 

   }

  });

  t2 = new Thread(() -> {

   for(char naa : na) {

    LockSupport.park();

    System.out.print(naa);

    LockSupport.unpark(t1);

   }

  });

  t1.start();

  t2.start();

 }

}

输出结果:

以上就是java实现两个线程交替打印的详细内容,感谢大家的学习和对脚本之家的支持。

相关文章

  • Java 判断一个时间是否在另一个时间段内

    Java 判断一个时间是否在另一个时间段内

    这篇文章主要介绍了Java 判断一个时间是否在另一个时间段内的相关资料,需要的朋友可以参考下
    2016-10-10
  • Java并发编程必备之Future机制

    Java并发编程必备之Future机制

    今天给大家带来的是关于Java并发编程的相关知识,文章围绕着Java Future机制展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java日期处理工具类

    java日期处理工具类

    这篇文章主要为大家详细介绍了java日期处理工具类,其次还介绍了日期处理的基础知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 基于java实现画图板功能

    基于java实现画图板功能

    这篇文章主要为大家详细介绍了基于java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • java多线程编程之慎重使用volatile关键字

    java多线程编程之慎重使用volatile关键字

    volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,下面看一下为什么要慎重使用volatile关键字
    2014-01-01
  • java单例模式学习示例

    java单例模式学习示例

    java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种,下面提供了单例模式的示例
    2014-01-01
  • SpringBoot如何防止XSS注入攻击详解

    SpringBoot如何防止XSS注入攻击详解

    这篇文章主要给大家介绍了关于SpringBoot如何防止XSS注入攻击的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    在IDEA中就提供了一个帮助你回退代码的机会,但这个方法并不是万能的,好了,下面就来具体说说IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法,感兴趣的朋友一起看看吧
    2022-04-04
  • 解决使用httpclient传递json数据乱码的问题

    解决使用httpclient传递json数据乱码的问题

    这篇文章主要介绍了解决使用httpclient传递json数据乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java旋转数组中最小数字具体实现(图文详解版)

    Java旋转数组中最小数字具体实现(图文详解版)

    这篇文章主要给大家介绍了关于Java旋转数组中最小数字具体实现的相关资料,旋转数组,说明数据不变,只是改变位置,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08

最新评论