Семафор

0
21 май 2015 13:34
Здравствуйте.Подскажите почему не запускается второй поток DecThread
Исходник и вывод ниже
package ru.tsalger;

import java.util.concurrent.*;

//пример простого семафора
class SemDome {
	public static void main(String args[]){
		Semaphore sem = new Semaphore(1);
		new IncThread(sem, "A");
		new DecThread(sem, "B");
	}

}
class Shared {
	//общий ресурс

		static int count = 0;
	
}
class IncThread implements Runnable {
	//поток выполнения увеличивающий значение счетчика на единицу
	
		String name;
		Semaphore sem;
		IncThread(Semaphore s, String n){
			sem = s;
			name = n;
			new Thread(this).start();
		}
		
		public void run(){
			System.out.println("Запуск " + name);
			try{
				//сначала получаем разрешение
				System.out.println(name + " ожидает разрешения.");
				sem.acquire();
				System.out.println(name + "  получает разрешение.");
				//теперь обращаемся к общему ресурсу
				
				for (int  i = 0; i< 5; i++){
					Shared.count++;
					System.out.println(name + ": " + Shared.count);
					//если это возможно разрешаем контекстное переключение
					Thread.sleep(10);
				}
			}catch(InterruptedException exc){
				System.out.println(exc);
			}
			//освобождаем разрешение
			System.out.println(name + " освобождает разрешение");
		}


}

class DecThread implements Runnable {
	//поток выполнения уменьшающий значение счетчика на единицу
	
		String name;
		Semaphore sem;
		
		DecThread(Semaphore s, String n){
			sem = s;
			name = n;
			new Thread(this).start();
		}
		public void run(){
			System.out.print("Зпуск " + name);
			//сначала получаем разрешение
			try{
				System.out.println(name + " ожидает разрешение");
				sem.acquire();
				System.out.println(name + " получает разрешение");
				
				//теперь обращаемся к общему ресурсу
				for(int i=0;i<5;i++){
					Shared.count--;
					System.out.println(name + ": " + Shared.count);
					//если это возможно разрешаем контекстное переключение 
					Thread.sleep(10);
				}
			}catch(InterruptedException exc){
				System.out.println(exc);
			}
			//освобождаем разрешение
			System.out.println(name + " освобождает разрешение");
			sem.release();
		}

}



Вывод:

Запуск A
A ожидает разрешения.
A получает разрешение.
A: 1
Запуск BB ожидает разрешение
A: 2
A: 3
A: 4
A: 5
A освобождает разрешение

Ответов: 1

0
21 май 2015 13:42
Потому что класс "IncThread" только притворяется, что "освобождает разрешение"
Модераторы: Нет
Сейчас эту тему просматривают: Нет