守护线程设置输入命令停止用户线程

问题描述 投票:0回答:1

我需要帮助解决我遇到的这个问题,所以如果有人遇到类似的问题,那将对我有很大帮助。该问题与 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”,然后程序结束。另外,我希望当我不输入任何内容时,它应该打印“所有球都跳了起来”并且程序应该结束。 我觉得这种行为很奇怪,因为如果我不输入任何内容,这会导致程序仍然等待我输入一些内容,那么当其他用户线程和主线程终止时,这个守护线程不应该终止吗?

java multithreading concurrency java-threads
1个回答
0
投票

欢迎来到 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”线程将一个接一个地终止,之后您的输入守护线程也将终止,最后是整个程序。

© www.soinside.com 2019 - 2024. All rights reserved.