问题描述:

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

如:

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. 微信小程序如何快速开通流量主

    1.先开发小程序,小程序需要有亮点,毕竟新颖(这样别人才更好去点击查看) 2.条件是独立访客(UV)不低于1000,1000人说多不多,说少也不少,因为小程序是没有链接的,是不可以进行一个流量刷取的, ...

  2. 【解决】虚拟windows7无法安装VMware Tools

    VMware安装虚拟windows7,在虚拟windows7上安装VMware Tools 报错VMware Alias Manager and Ticket 服务失败. Windows 无法启动 V ...

  3. React.Fragment

    React 中一个常见模式是为一个组件返回多个元素.Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点. Fragments 看起来像空的 JSX 标签: render() ...

  4. 如何写好转正答辩PPT

    如何写好一个转正答辩报告 几个月前,我刚经历了转正答辩,这是我职业生涯中转正答辩表现最好的一次.在我之前经历的几家公司中,转正的流程各不相同,我将它们为主动式和被动式.这里的被动式指的是:公司是主动方 ...

  5. lidar激光雷达领域的分类

    lidar领域可以按分为以下五方面: 激光雷达系统与装备 激光雷达系统与开发 激光雷达光源 激光雷达探测 多光谱激光雷达系统 单光子激光雷达系统 低成本RGB-D距离传感器 激光雷达元器件及装备等 激 ...

  6. string matching(拓展KMP)

    Problem Description String matching is a common type of problem in computer science. One string matc ...

  7. LightOJ - 1214-Large Division(c++取模 + java的两种写法)

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...

  8. Oracle12C配置对外访问

    Oracle12C配置对外访问 第一步: 开放端口或者关闭防火墙 第二步: 配置Oracle net manager打开Net manager 修改为共享服务器 第三步: 配置连接数打开Databas ...

  9. Zabbix housekeeper processes more than 75% busy

    原因分析 为了防止数据库持续增大,Zabbix有自动删除历史数据的机制,即housekeeper,而在频繁清理历史数据的时候,MySQL数据库可能出现性能降低的情况,此时就会告警. 一般来说,Zabb ...

  10. Java的String.matches不区分大小写正则表达式匹配示例

    需求:输入的cmd符合create,listall,delete三种形式,不用区分大小写 写成函数: public static boolean isAllowed3Cmd(String cmd) { ...