栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138992.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号