java实现多线程交替打印两个数

 更新时间:2020年11月23日 16:01:34   作者:格斗机器人-JAVA开发  
这篇文章主要为大家详细介绍了java实现多线程交替打印两个数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现多线程交替打印两个数的具体代码,供大家参考,具体内容如下

方法1、使用wait和notify

package com.thread;
 
public class T01 {
 
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 Object object = new Object();
 
 Thread thread1 = new Thread(() -> {
  synchronized(object){//使用notify和wait时,必须要选获取到锁
   for (int i = 0; i < char1.length; i++) {
   try {
    System.out.print(char1[i]);
    object.notify();
    object.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   }
   object.notify();//必须加上,否则程序无法结束,两个线程总有一个最后是wait状态,所以此处必须加
  }
  
 },"t1");
 
 
 Thread thread2 = new Thread( () -> {
  synchronized(object){
   for (int i = 0; i < char2.length; i++) {
   try {
    System.out.print(char2[i]);
    object.notify();
    object.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   }
   object.notify();
  }
 },"t2");
 
 thread1.start();
 thread2.start();
 
 }
}

方法2、使用LockSupport方法

package com.thread;
 
import java.util.concurrent.locks.LockSupport;
 
public class T02 {
 static Thread thread1 ;
 static Thread thread2 ;
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 
 thread1 = new Thread(() -> {
  for (int i = 0; i < char1.length; i++) {
   System.out.print(char1[i]);
   LockSupport.unpark(thread2);
   LockSupport.park();
  }
 },"t1");
 
  thread2 = new Thread(() -> {
  for (int i = 0; i < char2.length; i++) {
   LockSupport.park();
   System.out.print(char2[i]);
   LockSupport.unpark(thread1);
  }
 },"t2");
 
 thread1.start();
 thread2.start();
 
 }
 
 
}

方法3、使用CAS自旋锁

package com.thread;
 
public class T03 {
 enum ReadEnum{
 T1,
 T2;
 }
 static volatile ReadEnum r = ReadEnum.T1;
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 Thread thread1 = new Thread(() ->{
  for (int i = 0; i < char1.length; i++) {
  while (r != ReadEnum.T1) {
  }
  System.out.print(char1[i]);
  r = ReadEnum.T2;
  }
 },"t1");
 
 
 Thread thread2 = new Thread(() ->{
  for (int i = 0; i < char2.length; i++) {
  while (r != ReadEnum.T2) {
  }
  System.out.print(char2[i]);
  r = ReadEnum.T1;
  }
 },"t2");
 
 thread1.start();
 thread2.start();
 
 
 }
}

方法4、使用Condition方法

package com.thread;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
 
 
public class T04 {
 
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 
 ReentrantLock lock = new ReentrantLock();
 Condition condition1 = lock.newCondition();
 Condition condition2 = lock.newCondition();
 
 Thread thread1 = new Thread(() ->{
  try {
  lock.lock();
  for (int i = 0; i < char1.length; i++) {
   System.out.print(char1[i]);
   condition2.signal();//唤醒线程2执行
   condition1.await();//线程1等待
  }
  condition2.signal();
  }catch (Exception e) {
  e.printStackTrace();
  }finally{
  lock.unlock();
  }
 },"t1");
 
 Thread thread2 = new Thread(() ->{
  try {
  lock.lock();
  for (int i = 0; i < char2.length; i++) {
   System.out.print(char2[i]);
   condition1.signal();
   condition2.await();
  }
  condition1.signal();
  } catch (Exception e) {
  e.printStackTrace();
  }finally{
  lock.unlock();
  }
 
 },"t2");
 
 thread1.start();
 thread2.start();
 
 
 }
}

Condition与notify相比的好处是,Condition可以指定需要唤醒的线程,而notify是无法指定的,只能随机唤醒一个或者全唤醒(notifyAll)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中Redisson延迟队列的示例

    SpringBoot中Redisson延迟队列的示例

    延时队列是一种常见的需求,延时队列允许我们延迟处理某些任务,本文主要介绍了Redisson延迟队列的示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Java ShardingJDBC实战演练

    Java ShardingJDBC实战演练

    Sharding-JDBC 采用在 JDBC 协议层扩展分库分表,是一个以 jar 形式提供服务的轻量级组件,其核心思路是小而美地完成最核心的事情
    2021-11-11
  • Java Comparable及Comparator接口区别详解

    Java Comparable及Comparator接口区别详解

    这篇文章主要介绍了Java Comparable及Comparator接口区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • struts2的国际化实现网站整体中英文切换实例代码

    struts2的国际化实现网站整体中英文切换实例代码

    本篇文章主要介绍了struts2的国际化实现网站整体中英文切换实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MyBatis-Plus 条件查询器的实现

    MyBatis-Plus 条件查询器的实现

    本文主要介绍了MyBatis-Plus 条件查询器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何取消IDEA中的项目和Git仓库的关联

    如何取消IDEA中的项目和Git仓库的关联

    这篇文章介绍了一种取消已经开启代码控制的项目与Git仓库关联的简单方法,首先,在IntelliJ IDEA中打开项目,删除.idea目录下的vcs.xml文件,这样IDE界面上的Git图标就会消失,接下来,打开项目所在位置,通过文件管理器启用“显示隐藏的项目”选项
    2024-10-10
  • 详解Springboot中的异步、定时、邮件任务

    详解Springboot中的异步、定时、邮件任务

    这篇文章主要介绍了Springboot中的异步、定时、邮件任务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • java简单列出文件夹下所有文件的方法

    java简单列出文件夹下所有文件的方法

    这篇文章主要介绍了java简单列出文件夹下所有文件的方法,涉及java针对文件夹遍历操作相关技巧,需要的朋友可以参考下
    2016-08-08
  • 基于maven实现私服搭建步骤图解

    基于maven实现私服搭建步骤图解

    这篇文章主要介绍了基于maven实现私服搭建步骤图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例

    这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09

最新评论