Решение класса системы Java и сканеров -сканеров между запутанными потокамиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Решение класса системы Java и сканеров -сканеров между запутанными потоками

Сообщение Anonymous »

Итак, я сделал эту программу, которая моделирует ввод 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»