java - Java多线程大写字符串
问题描述
我有一个字符串:“abcdef”和 3 个线程:t1、t2 和 t3。我希望他们返回大写的字符串:“ABCDEF”(字符顺序无关紧要)。我设法将字符串大写 3 次。我希望这一切只发生一次。这是主要课程:
public static void main(String[] args) {
Thread t1 = new Thread(new CapitalizeString("Thread 1", "abcdef"));
Thread t2 = new Thread(new CapitalizeString("Thread 2", "abcdef"));
Thread t3 = new Thread(new CapitalizeString("Thread 3", "abcdef"));
t1.start();
t2.start();
t3.start();
}
这是用于大写的类:
import java.util.Random;
public class CapitalizeString implements Runnable {
String list;
String nameThread;
public CapitalizeString(String name, String str) {
nameThread = name;
list = str;
}
public void capitalize() {
char[] arr = list.toCharArray();
for (int i = 0; i < list.length(); i++) {
arr[i] = Character.toUpperCase(arr[i]);
System.out.println("Thread-ul " + nameThread + " solved " + arr[i]);
}
System.out.print("\n");
}
@Override
public void run() {
try {
capitalize();
} catch (Exception e) {
}
}
}
解决方案
这不仅会复杂得多,而且会慢很多倍。但是,作为练习,我建议使用最简单的方法,即使用 parallelStream
String upper = "abcdef".chars().parallel()
.map(Character::toUpperCase)
.mapToObj(c -> Character.toString((char) c))
.collect(Collectors.joining());
System.out.println(upper);
您可能想知道,为什么这会这么慢?以人类的规模考虑这一点,您可以
a) 在纸上手工转换字母,或
b) 你可以给三个朋友寄三封信,让他们给你寄两封大写的信。
除了更糟糕的是,因为必须首先启动线程,这需要更长的时间,所以真的是这样
c) 找到三个愿意回答你的信的新朋友,然后 b)
推荐阅读
- azure - 单个 Azure 文件共享使用警报和图表
- python - 如何在 for 循环中重复命令?
- javascript - openNav 和 closeNav 函数如何响应?
- python - Jinja2 For 循环中的 Flask 表单处理
- python - Flask Azure Web 应用程序部署成功,但显示默认页面
- python - 如何将每一行数据框合并到python中的列表中
- java - Scala - 从 DataSet 收集不同的值时,java.sql.Date 解析不正确
- java - 如何使用 EditText 和 RadioButtons(也设置颜色)顺利存储用户输入数据?
- python - 将 wav 文件传递给 IPython.display 时出错
- javascript - 如何让 Next.js “看到” react-dom 包?