当前位置:首页 > 实用技巧 >

java 怎么让一行最多输出两个数(java每行输出五个整数)

来源:原点资讯(www.yd166.com)时间:2023-12-27 07:09:11作者:YD166手机阅读>>

如题:假设有A、B 2个线程,分别依次输出1a2b3c4d,A线程输出数字,B线程输出字母。

下面有几种方法,感觉方法1是最容易想到的。

方法1:synchronized 和 wait/notify

/** * 使用 synchronized 和 wait notify */ private static void func1() { char[] num = new char[]{'1', '2', '3', '4'}; char[] str = new char[]{'A', 'B', 'C', 'D'}; Object lock = new Object(); AtomicBoolean printChar = new AtomicBoolean(true); new Thread("T1") { @Override public void run() { synchronized (lock) { for (char c : num) { try { while (printChar.get()) { printChar.set(false); System.out.println(getName() " >>> " c); lock.notify(); } lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } lock.notify(); // 这行一定要加,不然会在所有数据遍历完成后T2线程还是wait状态 } } }.start(); // 防止有的虚拟机上不是先输出数字的 try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } new Thread("T2") { @Override public void run() { synchronized (lock) { for (char c : str) { try { while (!printChar.get()) { printChar.set(true); System.out.println(getName() " >>> " c); lock.notify(); } lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 这一行是可以去掉的,因为T2线程遍历完最后一个数据会通过notify唤醒T1线程 // lock.notify(); } } }.start(); }

方法2:ReentrantLock 加 Condition

/** * 使用 ReentrantLock 加 Condition */ private static void func2() { char[] num = new char[]{'1', '2', '3', '4'}; char[] str = new char[]{'A', 'B', 'C', 'D'}; ReentrantLock reentrantLock = new ReentrantLock(true); Condition printCharCondition = reentrantLock.newCondition(); Condition printNumCondition = reentrantLock.newCondition(); new Thread("T1") { @Override public void run() { try { reentrantLock.lock(); for (char c : num) { System.out.println(getName() " >>> " c); printCharCondition.signal(); printNumCondition.await(); } printCharCondition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } }.start(); new Thread("T2") { @Override public void run() { try { reentrantLock.lock(); for (char c : str) { System.out.println(getName() " >>> " c); printNumCondition.signal(); printCharCondition.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } }.start(); }

方法3:使用信号量 Semaphore

/** * 使用 Semaphore */ private static void func3() { char[] num = new char[]{'1', '2', '3', '4'}; char[] str = new char[]{'A', 'B', 'C', 'D'}; Semaphore printNum = new Semaphore(1); Semaphore printChar = new Semaphore(0); new Thread("T1") { @Override public void run() { for (char c : num) { try { printNum.acquire(); System.out.println(getName() " >>> " c); printChar.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread("T2") { @Override public void run() { for (char c : str) { try { printChar.acquire(); System.out.println(getName() " >>> " c); printNum.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); }

方法4:使用自旋

/** * 使用自旋 */ private static void func4() { char[] num = new char[]{'1', '2', '3', '4'}; char[] str = new char[]{'A', 'B', 'C', 'D'}; AtomicBoolean printNum = new AtomicBoolean(true); new Thread("T1") { @Override public void run() { for (char c : num) { while (!printNum.get()) {} System.out.println(getName() " >>> " c); printNum.set(false); /** * 注意,上面的while循环的判断一定要加 !,否则后续的都可能无法输出了,如下写法就可能后续的无法输出 */ // while (printNum.get()) { // System.out.println(getName() " >>> " c); // printNum.set(false); // } } } }.start(); new Thread(("T2")) { @Override public void run() { for (char c : str) { while (printNum.get()) {} System.out.println(getName() " >>> " c); printNum.set(true); // while (!printNum.get()) { // System.out.println(getName() " >>> " c); // printNum.set(true); // } } } }.start(); } ,

栏目热文

java如何一次性输出多个数值(java四个数怎么单独输出)

java如何一次性输出多个数值(java四个数怎么单独输出)

本篇主要介绍Java的输入与输出,当然,这里说的是控制台下的输入与输出,窗口程序的设计将会再后续篇章中有详细说明。Jav...

2023-12-27 07:52:43查看全文 >>

java怎样输出一个数值(java中汉字怎样输出?)

java怎样输出一个数值(java中汉字怎样输出?)

在讲解什么是输入和输出之前,首先我们需要知道什么叫做输入与输出?我们以上一篇文章《自学Java6(保姆级教学)——基本数...

2023-12-27 07:38:38查看全文 >>

java每行输出六个数据(java如何实现输出连续的五个数)

java每行输出六个数据(java如何实现输出连续的五个数)

喜欢就关注小编,小编天天写,你也可以进步一点点Writer字符输出流的继承结构Writer字符输出流继承结构图:File...

2023-12-27 07:17:11查看全文 >>

java每行输出几个数后换行(java每输出10个数就换行)

java每行输出几个数后换行(java每输出10个数就换行)

前言我们在前面的文章中,学习了如何创建Java文件,也学习了java里的标识符、运算符、进制等内容。有些同学觉得还不够过...

2023-12-27 07:07:23查看全文 >>

java每五个数换一行怎么编写(java怎么在同一行输入两个数)

java每五个数换一行怎么编写(java怎么在同一行输入两个数)

原文5.5参数个数可变的方法可以提供参数个数可变的方法(有时,这些方法被称为“变参”(varargs) 方法)前面已经看...

2023-12-27 07:17:43查看全文 >>

远景与愿景区别(远景和目标的区别)

远景与愿景区别(远景和目标的区别)

企业文化之企业愿景解读企业文化之企业愿景解读1what:什么是愿景?愿景,有时也称为远景。顾名思义,就是指愿望里的景象,...

2023-12-27 07:05:59查看全文 >>

远景所能表达的效果(远景的作用及表达效果)

远景所能表达的效果(远景的作用及表达效果)

我们都知道语言符号的形式: 字,词(词组),单句,句群,段落,篇章。那么影视语言符号的形式: 镜头,镜头组,镜头段(段落...

2023-12-27 07:14:13查看全文 >>

远景意义(看远景的好处)

远景意义(看远景的好处)

主编温静导读:《极限挑战宝藏行·和美乡村季》聚焦于乡村这一主题具有更为重要的现实意义和远景意义。通过紧扣国家政策导向,基...

2023-12-27 07:49:05查看全文 >>

制作表格的工具免费完整版(快速制作表格软件)

制作表格的工具免费完整版(快速制作表格软件)

站长之家(ChinaZ.com)8月22日 消息:当与其他数据来源相结合,包括营销数据平台时,Excel 可以让一切一目...

2023-12-27 07:45:01查看全文 >>

制作表格怎么调表格大小(表格怎么整体变大)

制作表格怎么调表格大小(表格怎么整体变大)

Excel小技巧:快速调整表格。像这样很乱的表格,你是不是还在一个个调整大小?其实不用这样,只要点击左上角的三角符号,先...

2023-12-27 07:32:38查看全文 >>

文档排行