رشته ها (Threads)
«رشته ها (Threads)» یعنی اجرای چند کار هم زمان. این کار، کارایی را بالا می برد. همچنین، کارهای سنگین در پس زمینه اجرا می شوند و برنامه اصلی قطع نمی شود.
ایجاد و اجرای رشته با ارث بری از Thread
در این روش از کلاس Thread ارث می بری و متد run() را بازنویسی می کنی. سپس با start() اجرا می کنی.
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
گام های تمرینی
- یک حلقه در
run()بگذار و اعداد چاپ کن. - بعد از
start()، پیامی در main چاپ کن. - خروجی نامنظم را مشاهده کن.
ایجاد و اجرای رشته با پیاده سازی Runnable
در این روش، Runnable را پیاده سازی می کنی. سپس شیء Runnable را به سازنده Thread می دهی و start() را صدا می زنی.
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
نکته: با ارث بری از Thread، دیگر از کلاس دیگری ارث نمی بری. اما با Runnable می توانی از کلاس دیگری هم ارث ببری.
مشکلات هم زمانی (Concurrency)
ترتیب اجرا معلوم نیست. وقتی چند رشته یک متغیر مشترک را تغییر می دهند، مقدار نهایی غیرقابل پیش بینی می شود.
public class Main extends Thread {
public static int amount = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println(amount);
amount++;
System.out.println(amount);
}
public void run() {
amount++;
}
}
کاهش ریسک هم زمانی با isAlive()
می توانی صبر کنی تا رشته تمام شود. سپس روی داده مشترک کار کنی. این کار، نتیجه را پایدارتر می کند.
public class Main extends Thread {
public static int amount = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
while (thread.isAlive()) {
System.out.println("Waiting...");
}
System.out.println("Main: " + amount);
amount++;
System.out.println("Main: " + amount);
}
public void run() {
amount++;
}
}
برای ادامه مسیر، بخش عبارات باقاعده را مرور کن. سپس به عبارت های لامبدا برو.
جمع بندی سریع
- Thread کارها را هم زمان اجرا می کند.
start()، اجرایrun()را آغاز می کند.- Runnable انعطافِ ارث بری بهتر می دهد.
- هم زمانی، مقدارها را نامطمئن می کند.
isAlive()به هماهنگی ساده کمک می کند.