私は、出力されるすべてのものを出力するOutputクラスを持っています。Thread.sleep blocks otherスレッド
public class Output {
private static List<String> textList = new ArrayList<>();
private static Output output = null;
private Output() {
Runnable task =() -> {
int lastIndex = 0;
while (true) {
while (lastIndex < textList.size()) {
System.out.println(lastIndex + " - " + textList.size() + ": " + textList.get(lastIndex));
outputText(textList.get(lastIndex));
lastIndex ++;
}
}
};
new Thread(task).start();
}
private static void outputText(String text) {
synchronized (System.out) {
System.out.println(text);
}
}
public static void say(String text) {
if (output == null) {
output = new Output();
}
textList.add(text);
}
}
私は印刷するために何かを追加すると、すべてが正常に動作します:
for (int i = 0; i < 10; i++) {
Output.say("" + i);
}
しかし、私はそれが最初の出力に停止したループにThread.sleep
を追加します。
for (int i = 0; i < 10; i++) {
Output.say("" + i);
Thread.sleep(100);
}
どのようにすることができます私はそれを防ぐ?私は、唯一の主なスレッドではなく、別のスレッドをスリープ状態で停止していることを意味します。
どこにループを追加しますか?どこに2番目のスレッド? –
1)「say」_at all_のロジックが分からない。 'static'変数にアクセスするために' Output'のインスタンスが必要なのはなぜですか?コンストラクタでスレッドを開始することは一般的には良い考えではないことに注意してください。 2)私は 'textList'を突然変異させるところで' synchronized'ブロックを見ることはありません。 [JavaDoc for 'ArrayList'](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList)を参照してください。html) "_ **この実装は同期されていないことに注意してください。** _ _"(emphas theirs) –
最初のスレッドは通常のメインメソッドで、2番目のスレッドはOutputコンストラクタで開始します。私の誤りは、私は 'say'の' Output'のインスタンスを削除しました。私はArrayListが同期されていないことを知っていますが、私はそれを別々に解決する方法を知らない。 –