نحوه‌ی اجرای همروند چند Thread چگونه است؟

0 رأی
میانگین بازدید روزانه 0.3954 بازدید

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

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 اجرا شده. این علتش چیه؟ ممنون میشم اگر راهنماییم کنید.

سوال 4 ماه قبل در تالار برنامه نویسی توسط 1993 (41 امتیاز)

سوال های مشابه

+1 رأی
1 جواب میانگین بازدید روزانه 0.22220 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.0776 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.15278 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.17346 بازدید
+1 رأی
0 جواب میانگین بازدید روزانه 0.1323 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.4184 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.23237 بازدید
سوال 2 سال قبل در تالار کامپیوتر و اینترنت توسط mars (4 امتیاز)
0 رأی
0 جواب میانگین بازدید روزانه 0.4479 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.46191 بازدید
سوال 1 سال قبل در تالار برنامه نویسی توسط kapitan (25 امتیاز)
0 رأی
0 جواب میانگین بازدید روزانه 0.1144 بازدید
کانال تلگرام جواب یاب
...