PDA

View Full Version : سوال: درخواست توضیح در مورد Thread ها



Sina.iRoid
شنبه 22 آذر 1393, 10:44 صبح
سلام دوستان.

اگر امکانش هست میشه در مورد اجرای ترد های زیر یه توضیحی بدین!؟ من درست متوجه نمیشم که چی میشه. ممنون.

کد کلاس Clicker


public class Clicker implements Runnable{

int click = 0;
Thread thread;
private volatile boolean running = true;

//Constructor
public Clicker(int p) {
thread = new Thread(this);
thread.setPriority(p);
}

@Override
public void run() {

while (running) {
click++;
}
}

public void stop(){
running = false;
}

public void start(){
thread.start();
}
}


کد کلاس اصلی:


public class MainClassTest {


public static void main(String[] args) {

Thread.currentThread().setPriority(Thread.MAX_PRIO RITY);

Clicker hi = new Clicker(Thread.NORM_PRIORITY + 2);
Clicker lo = new Clicker(Thread.NORM_PRIORITY - 2);

lo.start();
hi.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}

lo.stop();
hi.stop();

//wait for child thread to terminate
try {
hi.thread.join();
lo.thread.join();
} catch (InterruptedException e) {
System.out.println("InterruptedException caught.");
}

System.out.println("Low-priority thread: " + lo.click);
System.out.println("High-priority thread: " + hi.click);
}
}


و این هم خروجی برنامه:
Low-priority thread: 159920241
High-priority thread: 207377818

من متوجه این کد نمیشم؟ Volatile برای چی هست؟
private volatile boolean running = true;

ممنون میشم اگر راهنماییم کنید.

storm_saeed
شنبه 22 آذر 1393, 15:36 عصر
volatile رو برای ابجکت ها یا primitive ها استفاده میکنیم یعنی اینکه مقدار این متغیر میتونه تو thread ها مختلف تغییر کنه ,thread ها ازشون کش داخلی نمیسازن و مستقیم مقدارش میره تو مموری اصلی و شما میتونید تو thread ها مختلف مقدارش رو تغییر بدید بدون اینکه بلاک بشه یعنی بصورت سنکرون دسترسی read و write داره

Sina.iRoid
شنبه 22 آذر 1393, 17:49 عصر
سلام.
میشه بگین که منظورتون از کش کردن چیه!؟ یعنی چه اتفاقی می افته!؟
ممنون.

storm_saeed
شنبه 22 آذر 1393, 23:41 عصر
سلام.
میشه بگین که منظورتون از کش کردن چیه!؟ یعنی چه اتفاقی می افته!؟
ممنون.
مثل همون متغیر محلی و گلوبال میمونه یعنی مقدارش مربوط به همون thread ای که داره اجرا میشه نیست برای کل thread ها گلوبال هست مقدارش

cups_of_java
یک شنبه 23 آذر 1393, 08:09 صبح
سلام.
میشه بگین که منظورتون از کش کردن چیه!؟ یعنی چه اتفاقی می افته!؟
ممنون.

پیاده سازی ترد ها توی اکثر سیستم های عامل به گونه ای هست که هر ترد فضای حافظه خودش رو داره یعنی استک و کانتکست اجرایی خاص خودش رو داره.
بنابر این وقتی شما یک متغیر تعریف میکنی هر تردی از اون متغیر یدونه توی کانتکست خودش داره و این در زمانی که برنامتون به شکل همروند میخواد اجرا شه می تونه مشکلاتی رو فراهم کنه.
برای همین نوع volatile توی جاوا رو تعریف کردن که نوشتن و خواندن روی متغیر ها رو به شکل اتومیک انجام بدن که البته کاملن موفق نبودن و باز مشکلاتی توی مدل حافظه جی وی ام پیش می اومد...

reyhaneh72
یک شنبه 07 دی 1393, 11:48 صبح
سلام.من سوال از ترد داشتم.خیلی حیاتیه.لطفا کمک کنید
میخوام بدونم چطور چند ترد باید منتظر بمونند که کار یک ترد دیگه تموم بشه؟؟؟تازه کارم :(

cups_of_java
یک شنبه 07 دی 1393, 12:39 عصر
سلام.من سوال از ترد داشتم.خیلی حیاتیه.لطفا کمک کنید
میخوام بدونم چطور چند ترد باید منتظر بمونند که کار یک ترد دیگه تموم بشه؟؟؟تازه کارم :(


اون چند تا ترد باید join رو روی شی اون ترد صدا کنند...

روش های دیگه ای هم هست البته مثل استفاده از notifyو ....