无法重启线程

时间:2013-05-24 05:59:49

标签: java multithreading java-me

我有以下主题:


public void start() {
        isRunning = true;

        if (mainThread == null) {
            mainThread = new Thread(this);
            mainThread.setPriority(Thread.MAX_PRIORITY);
        }

        if (!mainThread.isAlive()) {
            try {
                mainThread.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

在某些时候我想停止它的操作:


public void stop() {
        isRunning = false;
        System.gc();
}

再次调用start()时会抛出以下异常:

java.lang.IllegalThreadStateException

指向mainThread.start()代码行。

启动/停止线程的最佳方法是什么?我怎样才能使这个线程可重用?

谢谢!

2 个答案:

答案 0 :(得分:6)

一旦线程停止,你无法在Java中重启,但当然你可以用Java创建一个新的线程来完成你的新工作。

即使您创建新线程或重新启动相同的线程,用户体验也不会有所不同(这是您在Java中无法做到的)。

您可以阅读网站了解API规范http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html

您可能正在寻找的是Interrupts。中断是一个线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。

要了解有关中断的更多信息,请阅读Java教程指南http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

答案 1 :(得分:1)

在您的代码片段中,您似乎使用的Runnable类具有Thread属性。您可以使用下面的暂停/恢复,而不是使用停止/启动:

private boolean isPaused;

public void run() {
    while (!isRunning) {
        // do your stuff
        while (isPaused) {
            mainThread.wait();
        }
    }
}

public void suspend() {
    isPaused = true;
}

public void resume() {
    isPaused = false;
    mainThread.notify();
}

我没有添加synchronized块来保持代码较小,但您需要添加它们。