我构建了一个应该可以作为Thread
运行的应用程序类,听听Java开发人员的意见以改善我的编码风格会很好。
Main
上课。
package com.ozankurt;
public class Main {
public static void main(String[] args) {
Application application = new Application();
application.start();
}
}
申请类:
package com.ozankurt;
import com.ozankurt.utilities.Input;
public class Application implements Runnable {
private CommandHandler commandHandler;
private boolean running;
private volatile Thread thread;
private String threadName = "ApplicationThread";
public Application() {
Handler handler = new Handler(this);
this.commandHandler = new CommandHandler(handler);
this.running = true;
}
public void start() {
if (thread != null) {
System.out.println(threadName + "is already running.");
if (!isRunning())
{
System.out.println("Resuming " + threadName + "...");
setRunning(true);
}
} else {
System.out.println("Starting " + threadName + "...");
thread = new Thread(this, threadName);
thread.start();
System.out.println("Started " + threadName + ".");
}
}
public void stop() {
System.out.println("Halting " + threadName + "...");
setRunning(false);
System.out.println("Halted " + threadName + ".");
}
@Override
public void run() {
while (isRunning()) {
String userInput = Input.readLine();
commandHandler.handle(userInput);
}
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
}
我读了这篇Java documentation,关于如何在不使用已被弃用的stop
方法的情况下停止Java中的线程,因为它可能会引发一些例外。
据我所知,我们不应该尝试停止一个线程,而应该定义一个与线程状态相对应的属性。
在我的情况下,我在boolean running
课程中定义了Application
,您可以在run
方法中读取我的代码,然后基本检查应用程序是否为running
。这意味着我实际上从不停止该线程,我只使用while
语句删除其功能。这是Java documentation中解释的正确方法吗?
答案 0 :(得分:0)
请不要在Runnable上放置启动/停止方法,它只是弄乱了读者!大声笑!并且没有这个runnable尝试管理它自己的线程,它更令人困惑。
无论如何,第一个问题将是'running'boolean上缺少的volatile。
第二个问题是你的main()在你创建一个线程时结束了。它确实有效,但这表明你根本不需要任何线程。 main()线程可以调用一些Application.loopOnCommands()或类似的东西。
3,stop()不会中断线程。我假设readLine()可以阻塞并且handle(...)方法可以很长,因此发出中断信号可以唤醒等待线程。这并不总是强迫某个线程脱离代码,但如果该代码能够证明中断的可能性,它可以提供帮助。