关于多线程

时间:2010-03-22 03:39:46

标签: java multithreading

如何杀死线程? ..... 如何在多线程中重新启动它们?

7 个答案:

答案 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/880516

using 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详细信息的这篇文章:

How to properly use Java Executor?