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