如何杀死线程? ..... 如何在多线程中重新启动它们?
答案 0 :(得分:4)
由于你的帖子被标记为“Java”,我很清楚你在说什么。假设你通过以下方式开始一个线程:
Thread foo = new Thread(someRunnable);
foo.start();
现在不推荐使用destroy
和朋友,你需要一种方法来杀死线程。幸运的是,一直有“中断”的概念。只需更改您的runnable,以便在中断时退出。然后调用线程的interrupt
方法。
foo.interrupt();
如果您编写了Runnable来正确处理此问题,它将停止正在执行的操作并终止。
答案 1 :(得分:3)
Thread.stop()
杀死一个帖子,但你绝对不想要这样做(请参阅API文档以获得解释原因)。 Thread.interrupt()
向线程发送异步通知,以便它可以正常关闭。
关于Java多线程的综合文本,我推荐B. Goetz, Java Concurrency in Practice ,Addison-Wesley Professional。
答案 2 :(得分:3)
Thread
死的首选方法是执行run
方法完成:
Thread t = new Thread(new Runnable() {
public void run() {
// Do something...
// Thread will end gracefully here.
}
}
在上面的示例中,一旦线程正常死亡,Thread
无法重新启动。 (尝试在已经启动的线程上调用Thread.start
将导致IllegalThreadStateException
。)
在这种情况下,可以创建该线程的另一个实例并在其上调用start
。
从Lesson: Concurrency获取有关线程的更多信息的好地方可能是The Java Tutorials。
答案 3 :(得分:2)
我将我的工作线程包装在他们自己的类中,并使用终止属性来终止线程proc循环。
抱歉,我现在没有Java版本,但你应该从中得到这个想法 http://pastie.org/880516using System.Threading;
namespace LoaderDemo
{
class ParserThread
{
private bool m_Terminated;
private AutoResetEvent m_Signal;
private string m_FilePath;
...
public ParserThread(AutoResetEvent signal, string filePath)
{
m_Signal = signal;
m_FilePath = filePath;
Thread thrd = new Thread(this.ThreadProc);
thrd.Start();
}
public bool Terminated {
set { m_Terminated = value; }
}
private Guid Parse(ref string s)
{
//parse the string s and return a populated Guid object
Guid g = new Guid();
// do stuff...
return g;
}
private void ThreadProc()
{
TextReader tr = null;
string line = null;
int lines = 0;
try
{
tr = new StreamReader(m_FilePath);
while ((line = tr.ReadLine()) != null)
{
if (m_Terminated) break;
Guid g = Parse(ref line);
m_GuidList.Add(g);
lines++;
}
m_Signal.Set(); //signal done
}
finally
{
tr.Close();
}
}
}
}
答案 4 :(得分:1)
杀死线程的最佳方法是为要观看的线程设置一个标志。将线程编程为在标志设置为true时退出。没有办法重新启动一个被杀死的线程。
答案 5 :(得分:1)
如果你想随意启动,停止,重启线程,也许使用Java 5并发包是个好主意。你可以让Executor做一些工作,当你需要再次完成这项工作时,你可以重新安排它在执行程序中完成。
答案 6 :(得分:0)
关于你杀死线程的第一个问题:
您可以在以下SE问题中找到有关主题的更多详细信息:
How to properly stop the Thread in Java?
How can I kill a thread? without using stop();
How to start/stop/restart a thread in Java?
关于重新启动线程的第二个查询,在java中是不可能的。
您可以在文档page
中找到以下详细信息public void start()
使该线程开始执行; Java虚拟机调用此线程的run方法。
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
不止一次启动一个线程是不合法的。特别是,一旦完成执行,线程可能无法重新启动。
您可以使用高级并发API进行线程生命周期管理,而不是普通的线程。看一下ExecutorService详细信息的这篇文章: