Каждый поток должен получить свою задачу для запуска.
Вы реализовали run (), чтобы поток просматривал все сообщения, а не пропускал в каждый поток большую часть сообщений.
Дайте каждому потоку индексы, которые он должен записать в консоль.
Предполагая, что вы хотите создать 3 темы и у вас есть 12 сообщений, тогда:
Поток 1 будет печатать от 0 до 3,
Поток 2 напечатает 4 до 7,
Нить 3 напечатает от 8 до 11
public class LoggingThread extends Thread {
private boolean isStopped = false;
private CopyOnWriteArrayList<LogMessage> messages;
private int start,end;
public LoggingThread(CopyOnWriteArrayList messages, int start, int end) {
this.messages = messages;
this.start=start;
this.end=end;
}
@Override
public void run() {
for (int i = start; i < messages.size() && i<end; i++) {
writeMessageToConsole(messages.get(i).getMessageText(), messages.get(i).getLogLevel());
}
}
private synchronized void writeMessageToConsole(String message, LogLevel logLevel) {
System.out.println(message + " (" + logLevel + ")");
}
}
И создайте свои логи:
thread1 = new LoggingThread(this.messages, 0, this.messages.length()/3);
thread2 = new LoggingThread(this.messages, this.messages/3, 2*(this.messages.length()/3));
thread3 = new LoggingThread(this.messages, 2*(this.messages.length()/3), this.messages.length());
Каждая ветка получила треть сообщений для печати.
О порядке ... в том-то и дело, что потоки запускаются одновременно, поэтому вы не можете точно знать, что закончится первым и когда будет напечатан каждый журнал.
Однако вы можете подождать окончания каждого потока, прежде чем начинать следующий. это сохранит логи в порядке:
thread1.start();
thread1.join();
thread2.start();
thread2.join();
thread3.start();
thread3.join();
Но тогда нет смысла использовать три потока.