【发布时间】:2019-12-08 00:23:44
【问题描述】:
我想编写一个多线程应用程序,逐个打印字符串中的字符,并在第一个“回合”之后保留其他回合的顺序。它应该像这样工作:
对于字符串:
private String[] strings = {"aaaa", "bb", "ccccccccccccc", "dddddd"};
它会打印:
abcd abcd acd acd cd cd c c c c c c c
或许
dbac dbac dac dac dc dc c c c c c c c
取决于在第一轮中哪个进程首先开始
到目前为止我的解决方案是这样的
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Printer {
private CyclicBarrier cyclicBarrier;
private final static String one = "aaa";
private final static String two = "bbbb";
private final static String three = "c";
private final static String four = "dddddd";
public static void main(String[] args) {
Printer printer = new Printer();
printer.runSimulation(4);
}
private void runSimulation(int numberOfStrings) {
cyclicBarrier = new CyclicBarrier(numberOfStrings, new AggregatorThread());
Thread thread = new Thread(new PrintingThread(padSpaces(one, 10)));
Thread thread1 = new Thread(new PrintingThread(padSpaces(two, 10)));
Thread thread3 = new Thread(new PrintingThread(padSpaces(three, 10)));
Thread thread4 = new Thread(new PrintingThread(padSpaces(four, 10)));
thread.start();
thread1.start();
thread3.start();
thread4.start();
}
class AggregatorThread implements Runnable{
@Override
public void run() {
System.out.print(" ");
}
}
class PrintingThread implements Runnable{
private String toPrint;
private int iterator;
public PrintingThread(String toPrint) {
this.toPrint = toPrint;
this.iterator = 0;
}
@Override
public void run() {
while(iterator < toPrint.length()) {
System.out.print(toPrint.charAt(iterator));
iterator++;
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
private String padSpaces(String inputString, int length) {
if (inputString.length() >= length) {
return inputString;
}
StringBuilder sb = new StringBuilder();
while (sb.length() < length - inputString.length()) {
sb.append(' ');
}
StringBuilder sb1 = new StringBuilder(inputString);
sb1.append(sb);
return sb1.toString();
}
}
但它不保留写入控制台的字母顺序,而且我现在将字符串填充为一些硬编码值,但我希望在没有相等字符串的情况下使其正常工作。 对此有何建议?
【问题讨论】:
-
线程不是这样工作的。这就是有障碍的全部原因。如果您希望它们按顺序执行,则必须按顺序执行它们。
-
肯定有办法做到这一点,但既然你问的是'with
CyclicBarrier',我想你可能误解了CyclicBarrier的目的:)。
标签: java multithreading runnable synchronized java.util.concurrent