首页 > 解决方案 > 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) {
    }
}
}

标签: javamultithreading

解决方案


这不仅会复杂得多,而且会慢很多倍。但是,作为练习,我建议使用最简单的方法,即使用 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)


推荐阅读