دستگرمی

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

دستگرمی این هفته

با توجه به کد زیر، به سوال پاسخ دهید.

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

Loading ... Loading ...

پاسخ:

پاسخ صحیح: 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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا