Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Thread: How to re-start thread once completed?

I have a method void DoWork(object input) that takes roughly 5 seconds to complete. I have read that Thread is better suited than ThreadPool for these longer operations but I have encountered a problem.

I click a button which calls threadRun.Start(input) which runs and completes fine. I click the button again and receive the following exception:

Thread is running or terminated; it cannot restart.

Can you not "reuse" a Thread? Should I use ThreadPool? Why is Thread "better suited for longer operations" compared to ThreadPool? If you can't reuse a thread, why use it at all (i.e. what advantages does it offer)?

like image 261
john Avatar asked Mar 07 '12 22:03

john


People also ask

Can we restart the thread?

Once a thread enters dead state it cannot be restarted.

How do you start a thread after some time?

To do this properly, you need to use a ScheduledThreadPoolExecutor and use the function schedule like this: final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS); executor. schedule(new Runnable() { @Override public void run() { captureCDRProcess(); } }, 1, TimeUnit.

How do I start a dead thread again in Python?

You cannot restart a thread. When a thread finished, its stack is dead; its parent is flagged or signaled; once it's joined, its resources are destroyed (including kernel-level resources like its process table entry). The only way to restart it would be to create a whole new set of everything.

What happens to a thread after it finishes its task?

Short Answer: When a thread has finished its process, if nothing else holds a reference to it, the garbage collector will dispose of it automatically.


1 Answers

Can you not "reuse" a Thread?

You can. But you have to code the thread not to terminate but to instead wait for more work. That's what a thread pool does.

Should I use ThreadPool?

If you want to re-use a thread, yes.

Why is Thread "better suited for longer operations" compared to ThreadPool?

Imagine a thread pool that is serving a large number of quick operations. You don't want to have too many threads, because the computer can only do so many things at a time. Each long operation you make the thread pool do ties up a thread from the pool. So the pool either has to have lots of extra threads or may run short of threads. Neither leads to an efficient thread pool design.

For longer operations, the overhead of creating and destroying a thread is very small in comparison to the cost of the operation. So the normal downside of using a thread just for the operation doesn't apply.

If you can't reuse a thread, why use it at all (i.e. what advantages does it offer)?

I'm assuming you mean using a thread dedicated to a job that then terminates over using a thread pool. The advantage is that the number of threads will always equal the number of jobs this way. This means you have to create a thread every time you start a job and destroy a thread every time you finish one, but you never have extra threads nor do you ever run short on threads. (This can be a good thing with I/O bound threads but can be a bad thing if most threads are CPU bound most of the time.)

like image 84
David Schwartz Avatar answered Nov 11 '22 01:11

David Schwartz