دستگرمی دوازدهم
دستگرمی این هفته
با توجه به کد زیر، به سوال پاسخ دهید.
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