无法重新启动线程[重复]

Posted

技术标签:

【中文标题】无法重新启动线程[重复]【英文标题】:Can't restart thread [duplicate] 【发布时间】:2013-05-24 05:59:49 【问题描述】:

我有以下线程:


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

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

谢谢!

【问题讨论】:

不要让它完成 - 只需在顶部循环一些 wait() 。当您希望它运行时,发出信号。 不只是调用 start(),而是输入:new Thread(this).start(); 【参考方案1】:

一旦线程停止,您就无法在 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

【讨论】:

【参考方案2】:

从您的代码片段看来,您正在使用带有Thread 属性的Runnable 类。您可以在下面使用挂起/恢复,而不是使用停止/启动:

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 块来保持代码小,但您需要添加它们。

【讨论】:

以上是关于无法重新启动线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

AudioQueueStop 后音频队列无法重新启动

启动多个线程并重新启动它们

在 Python 中重新启动线程

尝试重新启动线程时发生 ThreadStateException

java线程只能被启动(Thread.start())一次,那么为啥线程池中的线程能被重复利用呢?

Wix刻录安装程序无法在静默安装时重新启动