java_multi_threading

برنامه نویسی Multi Threading

برنامه نویسی Multi Threading در جاوا
برنامه Multi Thread در اصطلاح به نوعی از برنامه ها اطلاق میشود که از قابلیت Multi Tasking سیستم عامل بهره میبرند. برنامه میتواند از دو یا چند Thread تشکیل شده باشد که به صورت همزمان و موازی اجرا شوند . همینطور که میدانید در سیستم عامل ویندوز میتوان چندین برنامه را به صورت همزمان اجرا نمود. در مورد Thread های یک برنامه نیز این وضعیت صدق میکند ، سیستم عامل میزان استفاده از پردازنده را بین آنها به اشتراک گذاشته و مدیریت میکند.

چرخه حیات یک Thread :
یک Thread از زمان ایجاد تا اتمام فعالیت ، دارای چرخه حیاتی است که در شکل زیر نمایش داده شده :

<a href=”http://www.datacode.ir/wp-content/uploads/2015/11/Thread_Life_Cycle.jpg”><img class=”wp-image-12445 size-large” src=”http://www.datacode.ir/wp-content/uploads/2015/11/Thread_Life_Cycle-1024×488.jpg” alt=”Thread_Life_Cycle” width=”669″ height=”318″ /></a> آموزش برنامه نویسی Multi Threading در جاوا

&nbsp;

مراحل چرخه حیات به شرح زیر است :

New : در این مرحله Threadساخته میشود ،هنوز شروع به فعالیت ننموده و سیستم عامل از وجود آن بی خبر است.

Runnable : بعد از start شدن ،Thread به وضعیت Runnable درآمده و سیستم عامل به صورت مدیریت شده منابع خود را در اختیار آن قرار میدهد.

Waiting : گاهی لازم است فعالیت Thread به صورت موقت متوقف شود تا عملیات Thread دیگری به اتمام برسد. در این مواقع Thread اولیه به حالت انتظار در آمده و در زمان مورد نظر دوباره فعال میشود.

Timed Waiting : میتوان برای مدت زمانی خاص مثلا چند ثانیه یک Thread را به وضعیت انتظار برد و پس از پایان زمان به صورت خودکار فعال شود و یا با وقوع یک شرط خاص آن را فعال نمود.

Terminated یا Dead : پس از پایان عملیات ، Thread از بین میرود.

&nbsp;

اولویت Thread :

هر Thread در جاوا یک اولویت دارد که به سیستم عامل جهت مدیریت منابع بین Thread ها کمک میکند. هر چه اولویت Thread بالاتر باشد سیستم عامل زمان بیشتری از پردازنده را در اختیار آن قرار میدهد و طبیعتا سریع تر اجرا میشود. اولیت Thread عددی بین ۱ تا ۱۰ است که نشان دهنده کمترین و بیشترین اولویت میباشد.

&nbsp;

مثال ۱: اولین Thread

برای استفاده از قابلیت Threading در جاوا به دو روش میتوان اقدام نمود که در ادامه با مثالهایی توضیح خواهیم داد :

در حالت اول باید کلاس مورد نظر ، یک interface به نام Runnable را ارث بری نموده و متد ()run آن را پیدا سازی نماید.
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true ” title=”RunnableClass “>package datacode.sample1;

public class RunnableClass implements Runnable {

@Override
public void run() {
System.out.println(“this is a new thread !!!”);
}
}
</pre>
برای اجرای Thread باید به صورت زیر عمل نمود :
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true ” title=”Runner”>package datacode.sample1;
public class Runner {
public static void main(String[] args) {
RunnableClass runnable=new RunnableClass();
Thread thread=new Thread(runnable,”thread name”);
thread.start();
}
}

</pre>
ابتدا یک شیء از RunnableClass ساخته میشود سپس با استفاده از کلاس Thread و متد start اجرا میشود.

مثال ۲ : برای سادگی پیاده سازی کلاس Runnable میتوانیم به شیوه زیر عمل کنیم.
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true ” title=”RunnableDemo.java”>package datacode.sample2;

class RunnableDemo implements Runnable {
private Thread t;
private String threadName;

RunnableDemo( String name){
threadName = name;
System .out.println(“Creating ” + threadName );
}
public void run() {
System .out.println(“Running ” + threadName );
try {
for(int i = 4; i &gt; 0; i–) {
System .out.println(“Thread: ” + threadName + “, ” + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
} catch (InterruptedException e) {
System .out.println(“Thread ” + threadName + ” interrupted.”);
}
System .out.println(“Thread ” + threadName + ” exiting.”);
}
public void start ()
{
System .out.println(“Starting ” + threadName );
if (t == null)
{
t = new Thread (this, threadName);
t.start ();
}
}
}
</pre>
میتوان یک متد start داخل کلاس RunnableDemo نوشت و شیء سازی از Thread را در آن انجام داد. برای استفاده از این کلاس به شیوه زیر عمل میشود :
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true ” title=”TestThread.java”>package datacode.sample2;

public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( “Thread-1″);
R1.start();
RunnableDemo R2 = new RunnableDemo( “Thread-2″);
R2.start();
}
}
</pre>
&nbsp;

خروجی این کلاس پس از اجرا به صورت زیر است :

Creating Thread-1

Starting Thread-1

Creating Thread-2

Starting Thread-2

Running Thread-1

Thread: Thread-1, 4

Running Thread-2

Thread: Thread-2, 4

Thread: Thread-2, 3

Thread: Thread-1, 3

Thread: Thread-1, 2

Thread: Thread-2, 2

Thread: Thread-1, 1

Thread Thread-1 exiting.

Thread: Thread-2, 1

Thread Thread-2 exiting.

در روش دوم پیاده سازی Multi Threading به جای ارث بری از اینترفیس Runnable از کلاس Thread ارث بری انجام میشود :
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true” title=”ThreadDemo.java”>class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name){
threadName = name;
System.out.println(“Creating ” + threadName );
}
public void run() {
System.out.println(“Running ” + threadNam e );
try {
for(int i = 4; i &gt; 0; i–) {
System .out.println(“Thread: ” + threadNam e + “, ” + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
} catch (InterruptedException e) {
System .out.println(“Thread ” + threadNam e + ” interrupted.”);
}
System.out.println(“Thread ” + threadNam e + ” exiting.”);
}
public void start ()
{
System.out.println(“Starting ” + threadNam e );
if (t == null)
{
t = new Thread (this, threadNam e);
t.start ();
}
}
}
</pre>
و برای اجرای آن به شکل زیر عمل میشود :
<pre class=”font-size:15 line-height:20 toolbar:1 lang:default decode:true ” title=”TestThread.java”>public class TestThread {
public static void main(String args[]) {
ThreadDem o T1 = new ThreadDem o( “Thread-1″);
T1.start();
ThreadDem o T2 = new ThreadDem o( “Thread-2″);
T2.start();
}
}
</pre>
خروجی این برنامه به صورت زیر است :

Creating Thread-1

Starting Thread-1

Creating Thread-2

Starting Thread-2

Running Thread-1

Thread: Thread-1, 4

Running Thread-2

Thread: Thread-2, 4

Thread: Thread-1, 3

Thread: Thread-2, 3

Thread: Thread-1, 2

Thread: Thread-2, 2

Thread: Thread-1, 1

Thread: Thread-2, 1

Thread Thread-1 exiting.

Thread Thread-2 exiting.

&nbsp;

نکته ۱ : برای تغییر وضعیت یک Thread به حالت انتظار به صورت زیر عمل میشود :
<p dir=”ltr”>Thread1.wait()</p>
<p dir=”ltr”>یا</p>
<p dir=”ltr”>Thread2.wait(1000) // Timed waiting milliseconds</p>
نکته ۲ : الویت Thread ها به صورت زیر تعیین میگردد :
<p dir=”ltr”>Thread1.setPriority(10);</p>
نکته ۳ : برای ایجاد وقفه زمانی در اجرای Thread از متد sleep میتوان استفاده کرد. به صورت زیر :
<p dir=”ltr”>Thread3.sleep(1000); // sleep 1000 millisecond</p>
&nbsp;

عنوان مطلب:”برنامه نویسی Multi Threading در جاوا”

&nbsp;




پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

code