قله بلند
سه شنبه 08 دی 1388, 18:10 عصر
با سلام
در این تاپیک قصد دارم تا یک برنامه ساده را که از دو نخ استفاده می کند، تحلیل کنم. یکی از نخ ها، نخ main و نخ دوم یک نخ بی نام که در کلاسی به نام counter ایجاد می شود. داستان را از جایی شروع می کنم که برنامه اجرا می شود.
1-تابع main اجرا می شود. یعنی نخ مربوط به برنامه اصلی، کارش را شروع می کند.
2-نخ جدید ساخته می شود ولی هنوز قابل اجرا نیست.
3-تابع start ، نقطه شروع را برای اجرای نخ تازه، معین می کند.
4-برنامه به تابع main باز می گردد.
5-دستورSystem.out.println(t) اجرا می شود.
6-نخ اصلی با یک وقفه 2 ثانیه ای رو به رو شده و در صف انتظار قرار می گیرد. حالا نوبت به اجرای نخ جدید می رسد.
7-برنامه به تابع run می رود و عدد 1 چاپ می شود. سپس با یک وقفه 2 ثانیه ای برخورد کرده و در صف انتظار قرار می گیرد.
8-2 ثانیه برای نخ main سپری شده و دستور System.out.println(t) اجرا می شود.
9-2 ثانیه مربوط به نخ جدید تمام شده و عدد 2 چاپ می شود. دوباره یک وقفه 2 ثانیه ای کار حلقه را عقب می اندازد. برنامه صبر می کند و سپس از حلقه خارج شده و دستور بعد از catch اجرا می شود. یعنی +چاپ می شود.
10- برنامه تمام می شود و نخ اصلی نیز می میرد.
سوال: آیا این تحلیل، کاملاً واقعی است یا یک جور احتمالات است؟ چون اجرای دستورات دیگر نیز زمانبر است و دقیقاً نمی توان گفت که مثلاً 2 ثانیه ای صبر کرده ایم.
نکته: وقتی به جای دستور Thread.sleep(2000) در نخ اصلی، از دستور t.stop(); استفاده کردم، اصلاً نخ جدید اجرا نشد و کاملاً از بین رفت و زمانیکه از دستور Thread.currentThread().stop(); استفاده کردم، دستورات بعدی در نخ اصلی دیگر اجرا نشد. یعنی تابع stop()، نخ زنده را می میراند.
import java.lang.Runnable;
class Counter implements Runnable {
public int count = 1;
public void run()
{
while (count < 3)
{
try
{
System.out.println(count);
Thread.sleep(2000);
}
catch (InterruptedException e)
{
}
count++;
} System.out.println("+");
}
}
public class B
{
public static void main(String args[]) throws Exception
{
Runnable r = new Counter();
Thread t = new Thread(r);
t.start();
System.out.println(t);
Thread.sleep(2000);
System.out.println(t);
}
}
در این تاپیک قصد دارم تا یک برنامه ساده را که از دو نخ استفاده می کند، تحلیل کنم. یکی از نخ ها، نخ main و نخ دوم یک نخ بی نام که در کلاسی به نام counter ایجاد می شود. داستان را از جایی شروع می کنم که برنامه اجرا می شود.
1-تابع main اجرا می شود. یعنی نخ مربوط به برنامه اصلی، کارش را شروع می کند.
2-نخ جدید ساخته می شود ولی هنوز قابل اجرا نیست.
3-تابع start ، نقطه شروع را برای اجرای نخ تازه، معین می کند.
4-برنامه به تابع main باز می گردد.
5-دستورSystem.out.println(t) اجرا می شود.
6-نخ اصلی با یک وقفه 2 ثانیه ای رو به رو شده و در صف انتظار قرار می گیرد. حالا نوبت به اجرای نخ جدید می رسد.
7-برنامه به تابع run می رود و عدد 1 چاپ می شود. سپس با یک وقفه 2 ثانیه ای برخورد کرده و در صف انتظار قرار می گیرد.
8-2 ثانیه برای نخ main سپری شده و دستور System.out.println(t) اجرا می شود.
9-2 ثانیه مربوط به نخ جدید تمام شده و عدد 2 چاپ می شود. دوباره یک وقفه 2 ثانیه ای کار حلقه را عقب می اندازد. برنامه صبر می کند و سپس از حلقه خارج شده و دستور بعد از catch اجرا می شود. یعنی +چاپ می شود.
10- برنامه تمام می شود و نخ اصلی نیز می میرد.
سوال: آیا این تحلیل، کاملاً واقعی است یا یک جور احتمالات است؟ چون اجرای دستورات دیگر نیز زمانبر است و دقیقاً نمی توان گفت که مثلاً 2 ثانیه ای صبر کرده ایم.
نکته: وقتی به جای دستور Thread.sleep(2000) در نخ اصلی، از دستور t.stop(); استفاده کردم، اصلاً نخ جدید اجرا نشد و کاملاً از بین رفت و زمانیکه از دستور Thread.currentThread().stop(); استفاده کردم، دستورات بعدی در نخ اصلی دیگر اجرا نشد. یعنی تابع stop()، نخ زنده را می میراند.
import java.lang.Runnable;
class Counter implements Runnable {
public int count = 1;
public void run()
{
while (count < 3)
{
try
{
System.out.println(count);
Thread.sleep(2000);
}
catch (InterruptedException e)
{
}
count++;
} System.out.println("+");
}
}
public class B
{
public static void main(String args[]) throws Exception
{
Runnable r = new Counter();
Thread t = new Thread(r);
t.start();
System.out.println(t);
Thread.sleep(2000);
System.out.println(t);
}
}