问题描述:

现有多个长度相同的数组,现要求使用多线程将数组内的数交替打印。

如:

int[] ai = {1,2,3,4,5,6,7};
String[] ac = {"A","B","C","D","E","F","G"};
最终打印出 : 1A2B3C4D5E6F7G。

实现方法(1)

1.使用 import java.util.concurrent.locks.LockSupport;

2.park方法和unpark方法。



代码分析:
import java.util.concurrent.locks.LockSupport;

public class T3 {
static Thread t1=null,t2=null,t3=null;
public static void main(String[] args) throws Exception {
int[] ao = {1,2,3,4,5,6};
String[] ab = {"A","B","C","D","E","F"};
boolean[] ac = {true,false,true,false,true,false}; t1 = new Thread(()->{
for (String a:ab) {
System.out.print(a+" ");
LockSupport.unpark(t2);
LockSupport.park();
}
},"t1"); t2 = new Thread(()->{
for (int b:ao) {
LockSupport.park();
System.out.print(b+" ");
LockSupport.unpark(t3);
}
},"t2"); t3 = new Thread(()->{
for (boolean c:ac) {
LockSupport.park();
System.out.print(c+" || ");
LockSupport.unpark(t1);
}
},"t3"); t1.start();
t2.start();
t3.start();
}
}

如上代码:

1.程序中,我定义了3个长度相同但类型不同的数组,因此开了三个线程 t1 , t2 , t3 。

2.三个线程同时使用start()方法;

3.其中,线程t1首先打印数组中的第一个数字,同时释放t2线程(unpark(t2)),阻塞自己(park(t1))。

4.t2线程释放,打印数组中的数字后释放t3,如此循环往复。

5.得出如下结论。

实现方法(2)

1. notify() + wait() 方法。

2. CountDownLatch 门栓机制()

private static CountDownLatch latch = new CountDownLatch(1);

可理解为我们平时门上的插销,参数为门栓的数量。目的是确定线程开始的顺序。

代码分析:
import java.util.concurrent.CountDownLatch;

public class Cycle {
private static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) throws Exception{
final Object s = new Object();
int[] ai = {1,2,3,4,5,6,7};
String[] ac = {"A","B","C","D","E","F","G"}; new Thread(()->{
try {
latch.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized (s){
for (int a:ai) {
System.out.print(a);
try {
s.notify();
s.wait();
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
s.notify();
} },"t1"
).start(); new Thread(
()->{
synchronized (s){
for (String b:ac) {
System.out.print(b);
latch.countDown();
try {
s.notify();
s.wait();
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
s.notify();
} },"t2"
).start();
}
}

1. 这里我们定义了一个门栓,一个锁,两个数组。

2. 同时start()两个线程。由于我在线程t1中上了门栓,且开门栓的方法在第二个线程中,因此,这就保证了第二个线程先开始。

3. t2先打印完,t1解锁.notify(),t2等待.wait()。如此循环往复。

4. 得出如下结论。

注:本篇文章来自于B站教学视频中的一点小小笔记,由于本人一直从事于C#工作,Java接触较少,上述文章中若有错误,还望纠正。

 

多线程循环打印数组 -- Java笔记的更多相关文章

  1. Java多线程循环打印ABC的5种实现方法

    https://blog.csdn.net/weixin_39723337/article/details/80352783 题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环 ...

  2. 多线程循环打印ABC

    主要是利用线程的wait()和notify()来实现 public class MyThread implements Runnable { private String name; private ...

  3. gdb流程控制(例: 循环打印数组)

    参考:https://blog.csdn.net/justlinux2010/article/details/9453151 循环/条件 在gdb的脚本中循环遍历整个哈希表,并且加上判断条件来进行统计 ...

  4. Java基础知识强化105:打印数组的方法总结

    1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印 ...

  5. java里如何实现循环打印出字符或字符数组里的内容

    不多说,直接上干货! java里如何实现循环打印出字符里的内容 没写,暂时不会 java里如何实现循环打印出字符数组里的内容 public class test { public static voi ...

  6. java里如何实现循环打印出字符串或字符串数组里的内容

    不多说,直接上干货! java里如何实现循环打印出字符串里的内容 思路:可以先将字符串转换成字符串数组. public class test { public static void main(Str ...

  7. 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC

    题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...

  8. java笔记 -- 数组

    概念: 数组是一种数据结构, 用来存储同一类型值的集合. 通过一个整型的下标可以访问数组中的每一个值. 声明: int[] a(推荐,将类型int[](整形数组)和变量名分开了) 或者int a[] ...

  9. Java学习之for循环打印菱形练习

    for循环语句是Java程序设计中非常有用的循环语句.一个for循环可以用来重复执行某条语句,直到某个条件得到满足.在Java 5新增的加强的foreach语法,也非常有用. 1. for语句 for ...

随机推荐

  1. 时间转换c#

    简要 本篇文章主要介绍基于.net(c#)封装的时间帮助类.主要功能是将时间戳与DateTime类型相互转换. 1.其中包括将毫秒级时间戳(13位).秒级时间戳(10位)转换为DateTime. 2. ...

  2. vue前端获取env中的常量

    process.env.常量名   如:process.env.MIX_APP_URL

  3. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  4. Unity技巧集合

    地址:http://blog.csdn.net/stalendp/article/details/17114135 这篇文章将收集unity的相关技巧,会不断地更新内容. 1)保存运行中的状态 uni ...

  5. 【译】Object Storage on CRAQ 上篇

    摘要 大型存储系统通常会在许多可能出故障的组件上进行数据复制和数据分区,从而保证可靠性和可扩展性.但是许多商业部署系统为了实现更高的可用性和吞吐量,牺牲了强一致性,特别是那些实时交互系统. 本论文介绍 ...

  6. directives 自定义指令

    钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选): bind:只调用一次,指令第一次绑定到元素时调用.在这里可以进行一次性的初始化设置.基本数据类型如果发生改变,不会触发,但是引用数据 ...

  7. MySQL互联网业务使用建议

    一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储 ...

  8. xUnit测试的顺序执行总结

    cmliu 1,演示环境:windows 10企业版+Visual Studio 2019:.NET Core3.1:xUnit 2.4.1:.NET Standard 2.0.3 3,场景描述:前几 ...

  9. charles安装破解步骤

    访问该地址https://www.zzzmode.com/mytools/charles/ 安装——生成破解工具charles.jar——替换

  10. selenium中各个模块操作:下拉框、鼠标悬浮连贯、拼图拖拽操作、以及其他拖拽操作、连线操作

    1.下拉框的修改操作 方法一:定位到元素后,通过select选择对应的值 方法二:通过两次点击的方法:没有select的value属性时,采用click两次的方法去选择: click第一次后,出现下拉 ...