0 امتیاز
قبل در برنامه نویسی توسط (242 امتیاز)

سلام. لطف کنید به کد زیر توجه کنید:

import java.util.concurrent.Semaphore;

public class R implements Runnable {
	private Semaphore semaphore;

	public R(Semaphore semaphore) {
		this.semaphore = semaphore;
	}

	@Override
	public void run() {
		try {
			semaphore.acquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Thread-Name: \"" + Thread.currentThread().getName() + "\" Started.");
		sleepThread();
		System.err.println("Thread-Name: \"" + Thread.currentThread().getName() + "\" Finished.");
		semaphore.release();
	}

	public void sleepThread() {
		try {
			Thread.sleep(2000);
			System.out.println(Thread.currentThread().getName() + ": After 2 Seconds.");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

و همچنین کد کلاس اصلی:

import java.util.concurrent.Semaphore;

public class Main {

	public static void main(String[] args) {
		Semaphore semaphore = new Semaphore(2);
		R r = new R(semaphore);
		for (int i = 1; i <= 5; i++) {
			new Thread(r, "Thread(" + i + ")").start();
		}
	}

}

همانطور که از کد مشخص است، کاری که بنده قصد دارم انجام دهم این است که در هر لحظه فقط دو ترد متد run را اجرا کنند. و این اتفاق هم می‌افتد. لطفا به خروجی کد دقت کنید:

Thread-Name: "Thread(3)" Started.
Thread-Name: "Thread(1)" Started.
Thread(1): After 2 Seconds.
Thread-Name: "Thread(1)" Finished.
Thread-Name: "Thread(3)" Finished.
Thread(3): After 2 Seconds.
Thread-Name: "Thread(2)" Started.
Thread-Name: "Thread(5)" Started.
Thread(5): After 2 Seconds.
Thread(2): After 2 Seconds.
Thread-Name: "Thread(5)" Finished.
Thread-Name: "Thread(4)" Started.
Thread-Name: "Thread(2)" Finished.
Thread(4): After 2 Seconds.
Thread-Name: "Thread(4)" Finished.

خروجی برنامه با چیزی که بنده توقع دارم برابر نیست. یعنی من توقع دارم برنامه به صورت زیر اجرا بشه:

یعنی ابتدا این دستور:

System.out.println("Thread-Name: \"" + Thread.currentThread().getName() + "\" Started.");

بعد متد sleepThread اجرا شود که در داخل این متد باید این دستور:

System.out.println(Thread.currentThread().getName() + ": After 2 Seconds.");

در خروجی چاپ شود و در آخر این دستور:

System.err.println("Thread-Name: \"" + Thread.currentThread().getName() + "\" Finished.");

اما همانطور که در خروجی‌ای که در بالا قرار دادم مشاهده می‌کنید، ابتدا ترد سوم تمام شده، و بعد خروجی متد sleepThread اجرا شده. این علتش چیه؟ ممنون میشم اگر راهنماییم کنید.

سوالات مشابه

+1 امتیاز
1 پاسخ 602 بازدید
0 امتیاز
0 پاسخ 321 بازدید
0 امتیاز
1 پاسخ 488 بازدید
+2 امتیاز
1 پاسخ 572 بازدید
0 امتیاز
0 پاسخ 820 بازدید
سوال شده 8 سال قبل در کامپیوتر و اینترنت توسط mars (4 امتیاز)
+1 امتیاز
1 پاسخ 349 بازدید
0 امتیاز
0 پاسخ 295 بازدید
+2 امتیاز
1 پاسخ 699 بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط kapitan (25 امتیاز)
...