问题描述:

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

如:

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. activemq的搭建

    说在前面的话: 本节主要介绍activemq的介绍以及activemq的安装,希望可以给迷惑中的读者带来一丝灵感,activemq的安装是基于linux环境下的 准备的环境: 一台安装jdk的linu ...

  2. java安全编码指南之:Mutability可变性

    目录 简介 可变对象和不可变对象 创建mutable对象的拷贝 为mutable类创建copy方法 不要相信equals 不要直接暴露可修改的属性 public static fields应该被置位f ...

  3. Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 给大家介绍个东西,MarkDown真的超级超级好用.哈哈.好了, 正题内容如下: 先 ...

  4. Android开发之java代码工具类。判断当前网络是否连接并请求下载图片

    package cc.jiusan.www.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; ...

  5. oeasy教您玩转linux010202软件包管理apt

    顾一下 上一部分我们都讲了什么?

  6. UGUI核心元素、基本控件、复合控件和高级控件

    UGUI的核心元素: Anchor(锚点):每个控件都有一个Anchor属性,控件的4个顶点,分别与Anchor的4个点保持不变的距离,不受屏幕分辨率变化的影响. 系统默认设置控件的Anchor位置在 ...

  7. Unity 打AssetBundle和加载方案

    一.如何组织assetBundle: unity5以前,打包需要自己去找依赖,然后需要按照拓扑图顺序压入AB栈,这样在最后打AB时才能有效利用依赖(栈内已有的AB才能作为依赖). unity5.x后, ...

  8. 会话技术之 Session

    会话技术之 Session 不多废话,先来一个 HelloWorld. Session 有 get 肯定要先有 set . @Override protected void service(HttpS ...

  9. format的实现

    var format = function(s, arg0) { var args = arguments; return s.replace(/\{(\d+)\}/ig, function(a, b ...

  10. 快速生成网络mp4视频缩略图技术

    背景 由于网络原因,在下载视频之前我们往往会希望能够先生成一些视频的缩略图,大致浏览视频内容,再确定是否应花时间下载.如何能够快速得到视频多个帧的缩略图的同时尽量少的下载视频的内容,是一个值得研究的问 ...