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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java同时启动多个 无法打印_java实现多线程交替打印两个数相关推荐
- java多线程交替打印_java实现多线程交替打印
本文实例为大家分享了java实现多线程交替打印的具体代码,供大家参考,具体内容如下 notify+wait实现 import org.junit.Test; import java.util.conc ...
- java多线程交替打印abc
你可以使用 synchronized 和 wait / notify 来实现多线程交替打印abc. 以下是一个示例代码: public class PrintABC {private intstate ...
- java多线程交替打印_java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现...
一 问题概述 线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的.但是同步线程并不一定是必须要实现互斥的.比如一个线程打印 ...
- java多线程交替打印_使用Java实现三个线程交替打印0-74
使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...
- java swing gui 实现简易计算器 当按下“=”时能实现两个数的加减乘除
实现简易计算器 当按下"="时能实现两个数的加减乘除 import javax.swing.*; import java.awt.*; import java.awt.event. ...
- java 指定打印机打印_java 指定打印机 进行打印
代码如下: package com.printer; import java.io.*; import java.util.Locale; import javax.print.*; import j ...
- java匿名启动线程_使用匿名内部类:来创建线程的两种方式
[Java]基础31:创建线程的两种方式 谢谢你的观看. 今天是我自学Java的第31天. 你的观看便是对我最大的鼓励. 话不多说,开始今天的学习: 线程的创建有两种方式,昨天学习过其中的一种: 创建 ...
- java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别
对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...
- Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...
[单选题]设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( ) [判断题]构造函数的方法名可以由编程人员任意命名. [单选题]能够实现对原文的鉴别和不可否认性的认证技术是( ). [单 ...
最新文章
- Sobel算子及cvSobel
- 数据库和区块链的异同
- JS设置浏览器URL,任意定制,安全可靠
- java3.3-3.6类与对象2020.3.13
- BZOJ.2716.[Violet3]天使玩偶(CDQ分治 坐标变换)
- Docker精华问答:Docker与虚拟机的区别?| 技术头条
- Qt工作笔记-WebEngineView调用web站点中的JS脚本(含Vue Cli脚本)
- SQL 2016 性能调优培训来了!!! 还免费!!!
- 关于社会工程学的利用
- SSD浅层网络_ssd目标检测
- Ubuntu18.04 下载与安装
- Python学习笔记---sep用法
- 计算机画大熊猫教案,大班美术画大熊猫教案
- 软件设计架构中各模块breakdown
- 基于模拟退火算法的TSP算法
- MJLQ2CH A java开发_新MacBook Pro的原彩显示技术是如何实现的?
- Shell-基础部分
- Blender 插件开发 将object设置成bpy.context.object
- UNI-APP 开发微信公众号(H5)JSSDK的使用、微信扫一扫
- 多模态 跨模态|人机交互新突破!
热门文章
- 磁力计 姿态 matlab,磁力计如何用来计算姿态(1)
- 【kafka】kafka topic Dump log
- 【Kafka】Kafka生产者producer相关参数详解batch.size linger.ms 等参数
- 【Java】Java中ThreadLocal简介以及源码
- Memcache图形化管理工具MemAdmin
- 60-270-040-源码-指标监测-Flink自定义metric监控流入量
- 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
- SpringBoot之AOP之基本使用
- Spring Boot Admin 的使⽤
- php require 输出乱码,php输出乱码