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

notify+wait实现

import org.junit.Test;

import java.util.concurrent.*;

public class TestThreadLocal {

Object o = new Object();

CountDownLatch c=new CountDownLatch(2);

@Test

public void vvvvvvvv() throws InterruptedException {

Thread t1 = new Thread() {

@Override

public void run() {

for (int i = 0; i < 26; i++) {

synchronized (o) {

System.out.print((char) (65 + i));

o.notify();

try {

if(i<25)o.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

c.countDown();

}

};

Thread t2 = new Thread() {

@Override

public void run() {

for (int i = 0; i < 26; i++) {

synchronized (o) {

System.out.print(1 + i);

o.notify();

try {

if(i<25)o.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

c.countDown();

}

};

t1.start();

t2.start();

//t1.join();

//t2.join();

c.await();

}

}

A1B2C3D4E5F6G7H8I9J10K11L12M13N14O15P16Q17R18S19T20U21V22W23X24Y25Z26

t2可能先执行,notify(只随机唤醒一个 wait 线程)改成notifyAll(唤醒所有 wait 线程)更好。

这两个方法只唤醒,被唤醒的线程处于runnable状态。想交替执行,需要负责唤醒的线程自己阻塞。

LockSupport实现

import org.junit.Test;

import java.util.concurrent.*;

import java.util.concurrent.locks.LockSupport;

public class TestThreadLocal {

CountDownLatch c=new CountDownLatch(2);

Thread t1 ,t2;

@Test

public void vvvvvvvv() throws InterruptedException {

t1 = new Thread() {

@Override

public void run() {

for (int i = 0; i < 26; i++) {

System.out.print((char) (65 + i));

LockSupport.unpark(t2);

LockSupport.park();

}

c.countDown();

}

};

t2 = new Thread() {

@Override

public void run() {

for (int i = 0; i < 26; i++) {

LockSupport.park();

System.out.print(1+i);

LockSupport.unpark(t1);

}

c.countDown();

}

};

t1.start();

t2.start();

//t1.join();

//t2.join();

c.await();

}

}

unpark调用时,如果当前线程还未进入park,则许可为true;

park调用时,判断许可是否为true,如果是true,则继续往下执行;如果是false,则等待,直到许可为true。

如果t2先执行,会park让t1先执行。如果t1先执行,打印后unpark t2,保证两个线程不会同时阻塞。

如果t2的LockSupport.park()和System.out.print(1+i)交换位置,可能出现t2连续打印两次的情况。

即t1打印后,执行unpartk(t2)前t2打印一次,然后t1 unpark t2后t2抢在t1前再打印一次。

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

原文链接:https://blog.csdn.net/weixin_43292547/article/details/109955789

java多线程交替打印_java实现多线程交替打印相关推荐

  1. java同时启动多个 无法打印_java实现多线程交替打印两个数

    本文实例为大家分享了java实现多线程交替打印两个数的具体代码,供大家参考,具体内容如下 方法1.使用wait和notify package com.thread; public class T01 ...

  2. java多线程中方法_java中多线程 - 多线程中的基本方法

    介绍一下线程中基本的方法使用 线程睡眠sleep() Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠.可以看到sleep是个静态方法 public static nativ ...

  3. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏

    本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下 实例:猜拳游戏 猜拳游戏是指小时候玩的石头.剪刀.布的游戏.客户端与服务器的"较量", ...

  4. java多线程常用面试_java的多线程常见面试题

    并行和并发有什么区别? (推荐学习:java常见面试题) 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事 ...

  5. java 多线程的使用_Java的多线程1:线程的使用

    概述 public enumState {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread stat ...

  6. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...

    java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是 ...

  7. java线程不能重复_Java中多线程重复启动

    标签: 在面试时候经常被问到多线程的相关问题: 今天在测试的时候发现下面的代码会抛出异常: java.lang.IllegalThreadStateException public static vo ...

  8. java 线程 状态 图_Java提高——多线程(一)状态图

    操作系统中的进程和线程的概念 进程是指一个内存运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程,比如windows下的一个运行的应用程序.exe就是一个进程. 线程是指进 ...

  9. java线程的优点_Java使用多线程的优势

    Java使用多线程的优势 如果使用得当,线程可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能.那么Java使用多线程的优势具体有哪些呢,一起来了解一下! 1.发挥多处理器的强大能力 现 ...

最新文章

  1. php从mysql 表中提取图片数据并显示
  2. VS .NET(C#)四舍五入方法(转)
  3. 学校开展计算机培训活动,计算机学院学习筑梦班开展义务清扫机房活动
  4. ThinkJs笔记琐碎
  5. JAVA 堆栈 堆 方法区 解析
  6. oftc注册服务器占用,golang服务器程序运行过程中崩溃,报错:fatal error: runtime: out of memory...
  7. 《Raspberry Pi用户指南》——2.3 Debian简介
  8. 科研|本科来自普通二本的博士3年迎来2篇Nature,创造校史!
  9. 深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
  10. (完美)华为畅玩7A AUM-AL00的Usb调试模式在哪里打开的步骤
  11. dell笔记本驱动安装失败_如何以正确的顺序重新安装驱动程序 | Dell 中国
  12. win10系统服务器不能创建对象,教你win10系统activex部件不能创建对象的解决教程...
  13. 拓展练习--find查找、打包压缩、服务器、磁盘挂载
  14. 利用爬虫获得疫情信息,并存入表格
  15. 电信ZNHG60光猫信息虚标
  16. Hive beeline详解
  17. 大面积无线网络覆盖5大方案,满足不同场所的实际需求
  18. [渝粤题库]西北工业大学材料力学(更新)
  19. oracle删除大量数据
  20. 写一个freeRTOS

热门文章

  1. sql server如何输出排序序号_Group by中子查询order by排序失效问题分析
  2. ip打包后如何加入 xilinx_科普!插上USB设备后电脑是怎么识别的呢?
  3. python中set函数作用如何自己用代码实现_Python进阶开发之元类编程
  4. 6位顺序号生成_分布式id生成策略,我和面试官扯了一个半小时
  5. c语言软件电脑下载文件,求C语言头文件下载?
  6. 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...
  7. Java对象垃圾回收调用,JVM垃圾回收之哪些对象可以被回收
  8. tensorflow权重初始化
  9. 基于PCA的人脸特征抽取
  10. 掌控谈话~拔刺(说出你对我的指控)