4

我有以下线程:


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()代码行。

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

谢谢!

4

2 回答 2

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

于 2013-05-24T06:03:34.397 回答
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块来保持代码小,但您需要添加它们。

于 2013-05-24T10:59:40.697 回答