دستگرمی دوازدهم

دستگرمی این هفته
با توجه به کد زیر، به سوال پاسخ دهید.
public class Runnak implements Runnable {
public static void main(String[] args) {
Runnak d = new Runnak();
new Thread(d).start();
Thread t1 = new Thread(d);
t1.start();
}
public void run() {
for (int j = 0; j < 3; j++) {
sleep1();
sleep2();
}
}
void sleep1() {
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.print("e ");
}
}
synchronized void sleep2() {
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.print("e ");
}
}
}
اجرای برنامه فوق حداقل چند ثانیه طول میکشد؟
- 6 (57%, 4 رای)
- 3 (14%, 1 رای)
- 9 (14%, 1 رای)
- 12 (14%, 1 رای)
- 7 (0%, 0 رای)
مجموع رای ها: 7
پاسخ:
پاسخ صحیح: 7 ثانیه
توجه داشته باشید که متد sleep2، به صورت synchronized تعریف شده است و به این معنی است که در هر لحظه حداکثر یک نخ میتواند این متد را اجرا کند.
اگر نخ اول را t0 و نخ دوم را t1 در نظر بگیریم،
در ثانیه اول، به ازای j=0 ، هر دو نخ، متد sleep1 را همزمان اجرا میکنند.
در ثانیه دوم، همانطور که اشاره شد، چون متد sleep2 به صورت synchronized تعریف شده، تنها یکی از دو نخ t0 و t1 میتواند این متد را اجرا کند. مثلا فرض کنید نخ t0 موفق میشود sleep2 را اجرا کند و نخ t1 باید یک ثانیه منتظر بماند تا بتواند سراغ این متد برود.
در ثانیه سوم، نخ t0 به ازای j=1، مجددا متد sleep1 را فراخوانی میکند و نخ t1 هم به ازای j=0، موفق میشود بالاخره sleep2 را فراخوانی کند.
در ثانیه چهارم، نخ t1 به ازای j=1، مجددا متد sleep1 را فراخوانی میکند و نخ t0 هم به ازای j=1، موفق میشود sleep2 را فراخوانی کند.
در ثانیه پنجم، نخ t0 به ازای j=2، مجددا متد sleep1 را فراخوانی میکند و نخ t1 هم به ازای j=1، موفق میشود sleep2 را فراخوانی کند.
در ثانیه ششم، نخ t1 به ازای j=2، مجددا متد sleep1 را فراخوانی میکند و نخ t0 هم به ازای j=2، موفق میشود sleep2 را فراخوانی کند.
در ثانیه هفتم، سرانجام نخ t1 به ازای j=2، متد sleep2 را فراخوانی کرده و اجرای برنامه به پایان میرسد.
| ثانیه اول |
t0.sleep1 t1.sleep1 |
| ثانیه دوم | t0.sleep2 |
| ثانیه سوم |
t0.sleep1 t1.sleep2 |
| ثانیه چهارم |
t0.sleep2 t1.sleep1 |
| ثانیه پنجم |
t0.sleep1 t1.sleep2 |
| ثانیه ششم |
t0.sleep2 t1.sleep1 |
| ثانیه هفتم | t1.sleep2 |
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers



