2011-04-11 67 views
1

我有下面的代码,有谁可以请澄清我的疑问。重新实例化线程

public static void Main() { 
    Thread thread = new Thread(Display); 
    thread.Start(); 
    Thread.Sleep(5000);  
    // Throws exception, thread is terminated, cannot be restarted. 
    thread.Start() 
} 

public static void Display() { 

} 

这似乎是为了重新启动线程我不得不再次实例化线程。这是否意味着我正在创建一个新线程?如果我继续创建100次重新注入,是否会创建100个线程并导致性能问题?

+0

你可能想排列'Display',以便它被线程池处理而不是手动创建一个线程。 – CodesInChaos 2011-04-11 12:21:03

+0

你究竟在做什么?通常情况下,通过让线程保持空闲状态来阻止线程创建开销,然后在进行更多工作时再次启动它们。但是,真的,你的实际问题是什么? – 2011-04-11 12:21:38

+0

线程和线程之间有区别。在上面的代码中,您正在启动线程“线程”两次。您调用的Sleep方法不会调用您已启动的线程,但应用程序主线程 – reggie 2011-04-11 12:24:45

回答

3

是的,您必须创建一个新线程或每次将任务提供给线程池以避免创建真正的新线程。您无法重新启动线程。

但是,我建议如果您的任务未能连续执行100次,您的问题比启动新任务的性能开销更大。

+0

好的,谢谢约翰。如果我想多次执行相同的方法,我需要一次又一次地将它添加到线程池队列中? – Lamps 2011-04-11 12:34:32

+0

@Bharskar:或者只是改变结构,以便在*线程内循环*直到它工作...有一个方法可以从同一个新线程多次调用Display,而不是每个* *调用的新线程。 – 2011-04-11 12:57:56

1

您不需要在sleep之后启动线程,线程会自动唤醒。这是相同的线程。

1

首先,如果线程已经启动,则无法启动该线程。在你的例子中,线程完成了工作,这就是为什么它处于终止状态。

您可以使用检查状态: Thread.ThreadState

1

你们是不是在完成前5秒唤醒线程呢?在这种情况下,你可以尝试使用监视器(等待,脉冲等)

+0

是的,我想执行很多次。 – Lamps 2011-04-11 12:35:34