Suppose
you divided a big problem into small tasks, let’s say one big problem is
divided into 5 small tasks. So to solve the whole problem. All the 5 tasks must
be completed, one task may finishes immediately, other takes 5 minutes, and
other may take 1 hour etc., Your program must wait until all the tasks finishes
its execution. Here the join method comes into picture.
The
join() method of Thread can be used to cause the current thread to block until the specified thread finish its execution.
HelloWorld.cs
using System.Threading; using System; namespace ThreadingTutorial { class HelloWorld { static void Main(string[] args) { Thread t1 = new Thread(() => task(1000)); Thread t2 = new Thread(() => task(4000)); Thread t3 = new Thread(() => task(2000)); Thread t4 = new Thread(() => task(5000)); Thread t5 = new Thread(() => task(3000)); t1.Name = "Thread1"; t2.Name = "Thread2"; t3.Name = "Thread3"; t4.Name = "Thread4"; t5.Name = "Thread5"; t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join(); Console.WriteLine("All threads Finished Execution"); } public static void task(int sleepTime) { Console.WriteLine(Thread.CurrentThread.Name + " : starts execution"); Thread.Sleep(sleepTime); Console.WriteLine(Thread.CurrentThread.Name + " : finishes execution"); } } }
Output
Thread1 : starts execution Thread2 : starts execution Thread3 : starts execution Thread5 : starts execution Thread4 : starts execution Thread1 : finishes execution Thread3 : finishes execution Thread5 : finishes execution Thread2 : finishes execution Thread4 : finishes execution All threads Finished Execution
To
understand join method better, comment all the join() calls and re-run the
application.
HelloWorld.cs
using System.Threading; using System; namespace ThreadingTutorial { class HelloWorld { static void Main(string[] args) { Thread t1 = new Thread(() => task(1000)); Thread t2 = new Thread(() => task(4000)); Thread t3 = new Thread(() => task(2000)); Thread t4 = new Thread(() => task(5000)); Thread t5 = new Thread(() => task(3000)); t1.Name = "Thread1"; t2.Name = "Thread2"; t3.Name = "Thread3"; t4.Name = "Thread4"; t5.Name = "Thread5"; t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); /*t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join();*/ Console.WriteLine("All threads Finished Execution"); } public static void task(int sleepTime) { Console.WriteLine(Thread.CurrentThread.Name + " : starts execution"); Thread.Sleep(sleepTime); Console.WriteLine(Thread.CurrentThread.Name + " : finishes execution"); } } }
Output
Thread1 : starts execution Thread3 : starts execution Thread2 : starts execution Thread5 : starts execution Thread4 : starts execution All threads Finished Execution Thread1 : finishes execution Thread3 : finishes execution Thread5 : finishes execution Thread2 : finishes execution Thread4 : finishes execution
As
you see the output, the message 'All threads Finished Execution' printed before
all the threads finishes their execution.
'Join'
method also available in overloaded forms. Methods that take arguments blocks
the calling thread until the thread represented by this instance terminates or
the specified time elapse
Join()
Join(Int32)
Join(TimeSpan)
No comments:
Post a Comment