本文实例为大家分享了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)

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

java同时启动多个 无法打印_java实现多线程交替打印两个数相关推荐

  1. java多线程交替打印_java实现多线程交替打印

    本文实例为大家分享了java实现多线程交替打印的具体代码,供大家参考,具体内容如下 notify+wait实现 import org.junit.Test; import java.util.conc ...

  2. java多线程交替打印abc

    你可以使用 synchronized 和 wait / notify 来实现多线程交替打印abc. 以下是一个示例代码: public class PrintABC {private intstate ...

  3. java多线程交替打印_java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现...

    一 问题概述 线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的.但是同步线程并不一定是必须要实现互斥的.比如一个线程打印 ...

  4. java多线程交替打印_使用Java实现三个线程交替打印0-74

    使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...

  5. java swing gui 实现简易计算器 当按下“=”时能实现两个数的加减乘除

    实现简易计算器 当按下"="时能实现两个数的加减乘除 import javax.swing.*; import java.awt.*; import java.awt.event. ...

  6. java 指定打印机打印_java 指定打印机 进行打印

    代码如下: package com.printer; import java.io.*; import java.util.Locale; import javax.print.*; import j ...

  7. java匿名启动线程_使用匿名内部类:来创建线程的两种方式

    [Java]基础31:创建线程的两种方式 谢谢你的观看. 今天是我自学Java的第31天. 你的观看便是对我最大的鼓励. 话不多说,开始今天的学习: 线程的创建有两种方式,昨天学习过其中的一种: 创建 ...

  8. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别

    对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...

  9. Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...

    [单选题]设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( ) [判断题]构造函数的方法名可以由编程人员任意命名. [单选题]能够实现对原文的鉴别和不可否认性的认证技术是( ). [单 ...

最新文章

  1. Sobel算子及cvSobel
  2. 数据库和区块链的异同
  3. JS设置浏览器URL,任意定制,安全可靠
  4. java3.3-3.6类与对象2020.3.13
  5. BZOJ.2716.[Violet3]天使玩偶(CDQ分治 坐标变换)
  6. Docker精华问答:Docker与虚拟机的区别?| 技术头条
  7. Qt工作笔记-WebEngineView调用web站点中的JS脚本(含Vue Cli脚本)
  8. SQL 2016 性能调优培训来了!!! 还免费!!!
  9. 关于社会工程学的利用
  10. SSD浅层网络_ssd目标检测
  11. Ubuntu18.04 下载与安装
  12. Python学习笔记---sep用法
  13. 计算机画大熊猫教案,大班美术画大熊猫教案
  14. 软件设计架构中各模块breakdown
  15. 基于模拟退火算法的TSP算法
  16. MJLQ2CH A java开发_新MacBook Pro的原彩显示技术是如何实现的?
  17. Shell-基础部分
  18. Blender 插件开发 将object设置成bpy.context.object
  19. UNI-APP 开发微信公众号(H5)JSSDK的使用、微信扫一扫
  20. 多模态 跨模态|人机交互新突破!

热门文章

  1. 磁力计 姿态 matlab,磁力计如何用来计算姿态(1)
  2. 【kafka】kafka topic Dump log
  3. 【Kafka】Kafka生产者producer相关参数详解batch.size linger.ms 等参数
  4. 【Java】Java中ThreadLocal简介以及源码
  5. Memcache图形化管理工具MemAdmin
  6. 60-270-040-源码-指标监测-Flink自定义metric监控流入量
  7. 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
  8. SpringBoot之AOP之基本使用
  9. Spring Boot Admin 的使⽤
  10. php require 输出乱码,php输出乱码