Итак, я сделал эту программу, которая моделирует ввод string Сообщение и записывает LocalDateTime при получении сообщения. Программа состояла из потоков , которые будут принимать сообщения одновременно (одно за другим, потому что она требует ввода пользователя, но поток существует одновременно) и Сообщение должно быть получено первым, чем все потоки будут печатать одновременно.public abstract class RunnableThread implements Runnable{
private String threadName;
public RunnableThread(String name) {
this.threadName = name;
}
@Override
public void run() { System.out.println("Hello Runnables " + threadName + "|| Thread start");
System.out.println("=========================\n");
for(int i = 0; i
Затем я создаю класс сообщений, как это. Он синхронизирован во вводе списка, поэтому list.add () будет выполнен один за один
public class TextMessage {
private String messages;
private String messageTime;
private static final Object lock = new Object();
private static final List messagequeue = new ArrayList();
private static volatile boolean allMessagesReady = false;
private static final int EXPECTED_MESSAGE_COUNT = 3;
public TextMessage(String messages, String messageTime) {
this.messages = messages;
this.messageTime = messageTime;
}
private String getMessages() {
return messages;
}
private String getMessageTime() {
return messageTime.toString();
}
public static void clearMessages(){
synchronized (lock) {
allMessagesReady = false;
messagequeue.clear();
}
}
public void getWholeMessage(){
System.out.println(getMessages() + " || " + getMessageTime());
}
public static boolean isArrayEmpty(){
return messagequeue.isEmpty();
}
public void registerAndWaitForOthers(){
synchronized (lock) {
messagequeue.add(this);
System.out.println("Message registered: \"" + messages + "\" (Total: " + messagequeue.size() + "/" + EXPECTED_MESSAGE_COUNT + ")");
if(messagequeue.size() >= EXPECTED_MESSAGE_COUNT){
allMessagesReady = true;
System.out.println("All messages ready, notifying all threads");
lock.notifyAll();
} else {
System.out.println("Message \"" + messages + "\" waiting for others... ");
try{
if(!allMessagesReady){
lock.wait();
}
} catch(InterruptedException e){
Thread.currentThread().interrupt();
System.out.println("Thread interrupted while waiting" + e.getMessage());
return;
}
}
}
System.out.println("proceeding to print.");
getWholeMessage();
}
}
А потом есть класс запуска , который я клянусь, я изо всех сил старался не сделать сканер и system.out гонки друг с другом.
public class TextRunnable extends RunnableThread {
private final Scanner scanner;
private final String threadName;
private static final Object CONSOLE_LOCK = new Object();
// Need to pass the scanner so they don't use input together
public TextRunnable(String threadName, Scanner scanner) {
super(threadName);
this.threadName = threadName;
this.scanner = scanner;
}
@Override
public void run() {
// System.out.println("Thread " + threadName + " started");
doWork();
}
@Override
public void doWork() {
String message;
LocalDateTime now;
try{
synchronized (CONSOLE_LOCK){
do{
System.out.println("Enter message:");
message = scanner.nextLine();
} while(message.isEmpty());
now = LocalDateTime.now();
}
TextMessage nm = new TextMessage(message, now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
nm.registerAndWaitForOthers();
} catch(Exception e){
System.out.println(threadName + " encountered error: " + e.getMessage());
Thread.currentThread().interrupt();
}
}
}
Но вывод остается подобным, что
Подробнее здесь: https://stackoverflow.com/questions/797 ... le-threads
Решение класса системы Java и сканеров -сканеров между запутанными потоками ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение