با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن. و کاربرانی که دوره کامل آموزش برنامه نویسی جاوا را دنبال می کنند. جاوا یک زبان برنامه نویسی چند نخی (Multithreading) است. این بدین معنی است که ما می توانیم یک برنامه چند نخی را با استفاده از Java توسعه دهیم. یک برنامه چند نخی حاوی دو یا چند قسمت است که می توانند همزمان اجرا شوند و هر بخش می تواند همزمان با انجام کارهای متفاوتی از منابع موجود به ویژه هنگامی که کامپیوتر شما چندین پردازنده دارد استفاده کند. قابلیت چند وظیفه ای امکان اجرای پردازش های مختلف در یک زمان روی یک پردازنده را فراهم می کند. قابلیت چند نخی نیز به یک برنامه امکان اجرای چندین موضوع مختلف را می دهد. برای آشنایی بیشتر با قابلیت چند نخی در جاوا در ادامه ی مباحث با ما همراه باشید.
با استفاده از قابلیت چند نخی در جاوا زمان پردازش نه تنها در چندین برنامه بلکه در چنیدن موضوع مختلف تقسیم می شود.
Multi-threading شما را قادر می سازد که فعالیت های چندگانه را همزمان در یک برنامه انجام می دهید.
اجرای یک thread در یک چرخه ی مشخص اتفاق افتاده و سپس از بین می رود.
این چرخه شامل تولد یک thread ، شروع اجرا و در نهایت نابود شدن آن است.
تشریح فرآیند چرخه ی یک thread :
New :
یک thread جدید چرخه ی خود را از وضعیت new آغاز می کند، و این حالت تا شروع چرخه می ماند.
Runnable :
پس از ایجاد یک thread ، این thread وضعیت قابل اجرا پیدا می کند و آماده ی اجراست.
Waiting :
گاهی اوقات یک thread برای اتمام thread در حال اجرا، به حالت انتظار یا waiting می رود.
Timed Waiting :
برای thread در حال انتظار یا waiting می توان یک زمان انتظار مشخص کرد.
(Terminated (Dead:
یک thread در حال اجرا پس از پایان فرآیند خود موقف می شود.
هر فرآیند thread دارای یک اولویت برای اجراست که به سیستم عامل کمک می کند تشخیص دهد کدام thread حق اجرا دارد.
اولویت های thread در محدوده ی MIN_PRIORITY (ثابت از ۱) و MAX_PRIORITY (ثابت از ۱۰) تعیین می شود.
به طور پیش فرض به هر thread اولویت NORM_PRIORITY (ثابت ۵) داده می شود.
البته اولویت های thread به طور قطعی ترتیب اجرای thread را تعیین نمی کند بلکه این بیشتر به پلتفرم بستگی دارد.
شما می توانید یک کلاس را به عنوان thread با اجرای اینترفیس Runnable اجرا کنید.
به عنوان اولین قدم، شما باید یک متد () run ارائه شده توسط اینترفیس Runnable را اجرا کنید.
این متد یک نقطه ورود برای موضوع را فراهم می کند و شما را در این متد کدهای مربوطه را قرار می دهید.
در زیر به یک دستورالعمل ساده از متد () run اشاره شده است:
1 | public void run( ) |
در مرحله ی دوم، شما یک شی thread را با استفاده از سازنده زیر ایجاد می کنید:
1 | Thread(Runnable threadObj, String threadName); |
threadObj نمونه ای از یک کلاس است که اینترفیس Runnable را اجرا می کند و threadName نامی است که به موضوع جدید داده شده است.
هنگامی که یک شی thread ایجاد می شود، می توانید آن را با فراخوانی () method اجرا کنید.
کد زیر ساختار ساده ی فراخوانی متد () start را نشان می دهد:
1 | void start(); |
مثال:
برنامه ی زیر یک thread جدید را ایجاد کرده و شورع به اجرای آن می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 > 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 (); } } } 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(); } } |
نتیجه ی اجرای برنامه ی فوق به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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. |
راه حل دوم برای ایجاد یک thread ایجاد یک کلاس جدید است که کلاس Thread را با استفاده از دو مرحله ساده زیر گسترش می دهد
این روش انعطاف پذیری بهتری را در برخورد با چند thread ایجاد شده با استفاده از متدهای موجود در کلاس Thread ایجاد می کند.
شما باید از متد () run در کلاس Thread استفاده کنید.
این متد یک نقطه ورود برای Thread را فراهم می کند.
در زیر یک دستورالعمل ساده از دستور () run ارائه شده است:
1 | public void run( ) |
هنگامی که یک شی Thread ایجاد می شود، می توانید آن را با فراخوانی متد ()start ، اجرا کنید که این متد ( ) run را اجرا می کند.
در زیر به یک دستورالعمل ساده از متد ()start اشاره شده است :
1 | void start( ); |
مثال – برای نمونه در این مثال برنامه قبلی را با این روش ارائه می دهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 " + threadName ); try { for(int i = 4; i > 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 (); } } } public class TestThread { public static void main(String args[]) { ThreadDemo T1 = new ThreadDemo( "Thread-1"); T1.start(); ThreadDemo T2 = new ThreadDemo( "Thread-2"); T2.start(); } } |
با اجرای کد فوق در جاوا نتیجه ی زیر را دریافت می کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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. |
در زیر لیستی از متدهای مهم موجود در کلاس Thread ارائه شده است:
ردیف | متد و توضیحات مربوطه |
---|---|
۱ | public void start() Thread را در مسیر جداگانه شروع کرده و سپس متد () run را بر روی این Thread تکرار می کند. |
۲ | public void run() اگر شیء Thread برا هدف جداگانه ای Runnable شده باشد، متد () run در آن شیء Runnable را فراخوانی می کند. |
۳ | public final void setName(String name) نام شی Thread را تغییر می دهد. همچنین متد () getName نیز برای بازیابی نام در دسترس است. |
۴ | public final void setPriority(int priority) اولویت Thread جاری را تعیین می کند. مقادیر اولویت بندی بین ۱ تا ۱۰ است. |
۵ | public final void setDaemon(boolean on) یک پارامتر Thread را به عنوان daemon thread تعریف می کند. |
۶ | public final void join(long millisec) Thread فعلی این متد را بر روی یک Thread دوم پیوند می دهد و موجب مسدود شدن جریان فعلی تا پایان اجرای دومی یا تعداد مشخصی از میلی ثانیه می شود. |
۷ | public void interrupt() این متد اجرای Thread را متوقف می کند. |
۸ | public final boolean isAlive() اگر thread تازه ایجاد شده یا هنوز در حال اجراست و نابود نشده True را بر می گرداند. |
متد های قبلی بر روی یک شی thread خاص فراخوانی می شوند.
متد های زیر در کلاس Thread استاتیک هستند. با استفاده از یکی از متد های استاتیک عملیات مربوط به موضوع در حال اجرا انجام می شود.
ردیف | متد و توضیحات مربوطه |
---|---|
۱ | public static void yield() باعث می شود که Thread فعلی در حال اجرا برای هر Thread دیگری از همان اولویت که انتظار می رود برنامه ریزی شود. |
۲ | public static void sleep(long millisec) باعث می شود که Thread فعلی در حال اجرا برای حداقل تعداد مشخصی از میلی ثانیه باشد. |
۳ | public static boolean holdsLock(Object x) اگر Thread فعلی قفل در Object داده شده درست شود، True را برمی گرداند. |
۴ | public static Thread currentThread() یک مرجع را برای thread در حال اجرا بر می گرداند. |
۵ | public static void dumpStack() ردیابی پشته را برای thread در حال اجرا ممکن می سازد که این حالت برای اشکال زدایی مناسب است. |
مثال – برنامه ThreadClassDemo زیر برخی از این متدهای کلاس Thread را نشان می دهد.
یک کلاس DisplayMessage را اجرا کنید که Runnable را اجرا می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class DisplayMessage implements Runnable { private String message; public DisplayMessage(String message) { this.message = message; } public void run() { while(true) { System.out.println(message); } } } |
در زیر به کلاس دیگری اشاره شده که کلاس Thread را گسترش می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class GuessANumber extends Thread { private int number; public GuessANumber(int number) { this.number = number; } public void run() { int counter = 0; int guess = 0; do { guess = (int) (Math.random() * 100 + 1); System.out.println(this.getName() + " guesses " + guess); counter++; } while(guess != number); System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**"); } } |
در زیر برنامه اصلی ما است که از کلاسهای تعریف شده ی فوق استفاده می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public class ThreadClassDemo { public static void main(String [] args) { Runnable hello = new DisplayMessage("Hello"); Thread thread1 = new Thread(hello); thread1.setDaemon(true); thread1.setName("hello"); System.out.println("Starting hello thread..."); thread1.start(); Runnable bye = new DisplayMessage("Goodbye"); Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_PRIORITY); thread2.setDaemon(true); System.out.println("Starting goodbye thread..."); thread2.start(); System.out.println("Starting thread3..."); Thread thread3 = new GuessANumber(27); thread3.start(); try { thread3.join(); } catch (InterruptedException e) { System.out.println("Thread interrupted."); } System.out.println("Starting thread4..."); Thread thread4 = new GuessANumber(75); thread4.start(); System.out.println("main() is ending..."); } } |
کد فوق نتیجه ی زیر را در جاوا تولید می کند و هر بار که برنامه ی فوق را اجرا کنید نتیجه ی متفاوتی را دریافت خواهید کرد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Starting hello thread... Starting goodbye thread... Hello Hello Hello Hello Hello Hello Goodbye Goodbye Goodbye Goodbye Goodbye ....... |
در این بخش برای دستیابی به قابلیت اجرای هم زمان چند موضوع مختلف با یک برنامه که به قابلیت چند نخی شناخته می شود ، ما مباحث آشنایی با قابلیت چند نخی در جاوا را ارائه کردیم. در بخش بعدی به آشنایی با مفاهیم Applet در جاوا می پردازیم.
حسن
آقا دستت درد نکنه خدا خیرت بده
نوید
تشریحات تان خیلی به شکل پیشرفته است و کمی گنگ