我需要帮助解决我遇到的这个问题,所以如果有人遇到类似的问题,那将对我有很大帮助。该问题与 Java 中的并发编程有关。
我有一个球类和一个测试类。我创建了一个需要输入的守护线程,如果输入命令“STOP”,所有线程都会停止运行,程序应该打印“Jumping aborted”并且程序应该终止。另一方面,如果我不输入任何内容,程序就必须打印“所有球都已跳跃”,并且程序才能完成工作。
这是我的代码:
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<Ball> 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...");
}
}
}
我想要的是,当我输入“STOP”时,它会显示“Jumping Aborted”,然后程序结束。另外,我希望当我不输入任何内容时,它应该打印“所有球都跳了起来”并且程序应该结束。 我觉得这种行为很奇怪,因为如果我不输入任何内容,这会导致程序仍然等待我输入一些内容,那么当其他用户线程和主线程终止时,这个守护线程不应该终止吗?
欢迎来到 Stackoverflow!
在您输入 STOP 之前,您的程序不会终止,因为所有“Ball”线程仍在运行并等待“flag”变量变为 false。
“跳跃”之后,保留“Ball”线程是没有意义的,因此您应该终止它,也许可以通过在 while 循环中插入 break 语句来终止它:
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();
}
break;
}
}
}
}
所有“Balls”线程将一个接一个地终止,之后您的输入守护线程也将终止,最后是整个程序。