Поток демона настроен на ввод команды для остановки пользовательских потоковJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Поток демона настроен на ввод команды для остановки пользовательских потоков

Сообщение Anonymous »

Мне нужна помощь в решении этой проблемы, которая у меня есть, поэтому, если у кого-то была подобная проблема, это мне очень поможет. Проблема связана с параллельным программированием на Java.
У меня есть класс Ball и класс Test. Я создал поток демона, который требует ввода, и если введена команда «СТОП», все потоки прекращают работу, и программа должна вывести «Прыжок прерван», и программа должна завершиться. С другой стороны, если я ничего не ввожу, то необходимо, чтобы программа напечатала, что "Все шарики подскочили", и чтобы программа закончила работу.
Вот мой код :

Код: Выделить всё

Ball.java

Код: Выделить всё

public class Ball extends Thread {
public int id;
public static volatile boolean flag = false;
public static volatile Object lock = new Object();
public boolean isJumped = false;

public Ball(int id) {
this.id = id;
}

public void pauseThread() {
flag = true;
}

@Override
public void run() {
while (!flag) {
synchronized (lock) {
if (flag) {
lock.notifyAll();
break;
}
if (!isJumped) {
System.out.println("Ball " + id + " jumping...");
isJumped = true;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}

Код: Выделить всё

Test.java

Код: Выделить всё

import java.io.IOException;
import java.lang.reflect.Array;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;

public class Test
{
private static volatile boolean on = true;
public static Object lock = new Object();
public static void main(String args[])
{
List balls  =  new ArrayList();
for(int i = 0; i < 50; i++)
{
Ball ball = new Ball(i);
balls.add(ball);

}
for(Ball ball : balls)
{
ball.start();
}

// Create a deamon thread:

Thread inputThread = new Thread(() -> {
while (true) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine().toUpperCase();

if (input.equals("STOP")) {
for (Ball ball : balls) {
ball.pauseThread();
}
on = false;
System.out.println("Jumping Aborted...");
break;
}
}

});
inputThread.setDaemon(true);
inputThread.start();

if (on) {
for (Ball ball : balls) {
try {
ball.join();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
System.out.println("All balls are jumped...");
}

}
}
Я хочу, чтобы при вводе «СТОП» появлялось сообщение «Прыжок прерван», и программа завершалась. Кроме того, я хочу, чтобы, когда я ничего не ввожу, оно должно было напечатать «Все шары прыгнули», и программа должна завершиться.
Я нахожу такое поведение странным, потому что, если я ничего не ввожу, это приводит к тому, что программа все еще ждите, пока я что-нибудь введу, разве этот поток демона не должен завершиться, когда завершаются другие пользовательские потоки и основной поток?

Подробнее здесь: https://stackoverflow.com/questions/790 ... er-threads
Ответить

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

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

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

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

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