我的多线程实现好吗?

时间:2016-01-29 06:44:33

标签: java multithreading

我构建了一个应该可以作为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中解释的正确方法吗?

1 个答案:

答案 0 :(得分:0)

请不要在Runnable上放置启动/停止方法,它只是弄乱了读者!大声笑!并且没有这个runnable尝试管理它自己的线程,它更令人困惑。

无论如何,第一个问题将是'running'boolean上缺少的volatile。

第二个问题是你的main()在你创建一个线程时结束了。它确实有效,但这表明你根本不需要任何线程。 main()线程可以调用一些Application.loopOnCommands()或类似的东西。

3,stop()不会中断线程。我假设readLine()可以阻塞并且handle(...)方法可以很长,因此发出中断信号可以唤醒等待线程。这并不总是强迫某个线程脱离代码,但如果该代码能够证明中断的可能性,它可以提供帮助。