Java多线程实战之交叉打印的两种方法

 更新时间:2019年02月11日 16:28:52   作者:邋遢的流浪剑客  
今天小编就为大家分享一篇关于Java多线程实战之交叉打印的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

要求效果:先打印5次“printA…”,再打印5次“printB…”,每次打印间隔1秒,重复循环20次

方式一:使用wait()和notifyAll()方法

public class MyService {
 private volatile boolean flag = false;
 public synchronized void printA() {
 try {
  while (flag) {
  wait();
  }
  for (int i = 0; i < 5; i++) {
  System.out.println("printA...");
  TimeUnit.SECONDS.sleep(1);
  }
  flag = true;
  notifyAll();
 } catch (InterruptedException e) {
  e.printStackTrace();
 }
 }
 public synchronized void printB() {
 try {
  while (!flag) {
  wait();
  }
  for (int i = 0; i < 5; i++) {
  System.out.println("printB...");
  TimeUnit.SECONDS.sleep(1);
  }
  flag = false;
  notifyAll();
 } catch (InterruptedException e) {
  e.printStackTrace();
 }
 }
}
public class BackupA implements Runnable {
 private MyService myService;
 public BackupA(MyService myService) {
 super();
 this.myService = myService;
 }
 @Override
 public void run() {
 myService.printA();
 }
}
public class BackupB implements Runnable {
 private MyService myService;
 public BackupB(MyService myService) {
 super();
 this.myService = myService;
 }
 @Override
 public void run() {
 myService.printB();
 }
}
public class Run {
 public static void main(String[] args) {
 MyService myService = new MyService();
 for (int i = 0; i < 20; i++) {
  new Thread(new BackupA(myService)).start();
  new Thread(new BackupB(myService)).start();
 }
 }
}

方式二:使用await()和signalAll()方法

public class MyService {
 private Lock lock = new ReentrantLock();
 private Condition condition = lock.newCondition();
 private boolean flag = false;
 public void printA() {
 try {
  lock.lock();
  while (flag) {
  condition.await();
  }
  for (int i = 0; i < 5; i++) {
  System.out.println("printA...");
  TimeUnit.SECONDS.sleep(1);
  }
  flag = true;
  condition.signalAll();
 } catch (InterruptedException e) {
  e.printStackTrace();
 } finally {
  lock.unlock();
 }
 }
 public void printB() {
 try {
  lock.lock();
  while (!flag) {
  condition.await();
  }
  for (int i = 0; i < 5; i++) {
  System.out.println("printB...");
  TimeUnit.SECONDS.sleep(1);
  }
  flag = false;
  condition.signalAll();
 } catch (InterruptedException e) {
  e.printStackTrace();
 } finally {
  lock.unlock();
 }
 }
}
public class ThreadA implements Runnable {
 private MyService myService;
 public ThreadA(MyService myService) {
 super();
 this.myService = myService;
 }
 @Override
 public void run() {
 myService.printA();
 }
}
public class ThreadB implements Runnable {
 private MyService myService;
 public ThreadB(MyService myService) {
 super();
 this.myService = myService;
 }
 @Override
 public void run() {
 myService.printB();
 }
}
public class Run {
 public static void main(String[] args) {
 MyService myService = new MyService();
 for (int i = 0; i < 20; i++) {
  new Thread(new ThreadA(myService)).start();
  new Thread(new ThreadB(myService)).start();
 }
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • spring boot利用docker构建gradle项目的实现步骤

    spring boot利用docker构建gradle项目的实现步骤

    这篇文章主要给大家介绍了关于spring boot利用docker构建gradle项目的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2018-05-05
  • Java实现顺序表的操作详解

    Java实现顺序表的操作详解

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。本文主要介绍了顺序表的实现与常用操作,需要的可以参考一下
    2022-09-09
  • Java数据结构篇之实现二叉搜索树的核心方法

    Java数据结构篇之实现二叉搜索树的核心方法

    二叉搜索树是一种常用的数据结构,它是一棵二叉树,且每个节点的值都大于其左子树中任何节点的值,而小于其右子树中任何节点的值,这篇文章主要给大家介绍了关于Java数据结构篇之实现二叉搜索树的核心方法,需要的朋友可以参考下
    2023-12-12
  • Java深入讲解Bean作用域与生命周期

    Java深入讲解Bean作用域与生命周期

    这篇文章主要介绍了浅谈Spring中Bean的作用域和生命周期,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-06-06
  • Java代码实现四种限流算法详细介绍

    Java代码实现四种限流算法详细介绍

    本文主要介绍了Java代码实现四种限流算法详细介绍,包含固定窗口限流,滑动窗口限流,漏桶限流,令牌桶限流,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • java中Servlet处理乱码的方法

    java中Servlet处理乱码的方法

    java中Servlet处理乱码的方法,需要的朋友可以参考一下
    2013-03-03
  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信实例详解

    这篇文章主要介绍了Java多线程中线程间的通信实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java栈的三种实现方式(完整版)

    Java栈的三种实现方式(完整版)

    这篇文章主要介绍了Java栈的三种实现方式(完整版),需要的朋友可以参考下
    2020-12-12
  • 解决poi导出时单元格样式被覆盖问题

    解决poi导出时单元格样式被覆盖问题

    这篇文章主要介绍了解决poi导出时单元格样式被覆盖问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java中的常见几种发送http请求实例

    java中的常见几种发送http请求实例

    在Java编程中,发送HTTP请求是一个常见需求,常用的方法有四种:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式时,需要添加额外的库支持
    2024-11-11

最新评论