У меня есть класс 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
Мобильная версия