semafory - nie rozumiem ;(

0

Ten kod ma za zadanie wypisaywac na przemian literki a i b. No i to robi, ale ja nie rozumiem do konca dzialania semaforow. Moglby ktos po ludzku wytlumaczyc? Tylko nie odsylajcie mnie na google, bo juz szukalam, ale dalej nie czaje. Tak na chlopski rozum jakby ktos umial wytulamczyc ;D

kod;

import java.util.concurrent.Semaphore;

class A extends Thread{
	
	private Semaphore semA;
	private Semaphore semB;
	
	public A(Semaphore a, Semaphore b){
		this.semA = a;
		this.semB = b;
	}
	
	public void run(){
		while(true)
		{
		 semA.acquireUninterruptibly();
		 System.out.println("A");	
		 semB.release();
		}
	}
	
}

class B extends Thread{
	
	private Semaphore semB;
	private Semaphore semA;
	
	public B(Semaphore a, Semaphore b){
		this.semA = a;
		this.semB = b;
	}
	
	public void run(){
		while(true)
		{
		 semB.acquireUninterruptibly();
		 System.out.println("B");	
		 semA.release();
		}
	}
	
}

public class PodstawySemaforow {
	public static void main(String[] args) {
		
		Semaphore semA = new Semaphore(1,true);  
	    Semaphore semB = new Semaphore(0,true); 
		
		A a = new A(semA, semB);
		B b = new B(semA, semB);
		
		b.start();
		a.start();
		
	}
}
0

A wiesz jak działa semafor ? I wiesz, że w sekcji krytycznej może przebywać tylko jeden wątek na raz ? To teraz sobie rozrysuj, jak to działa - jakie są stany semaforów po kolei, itp.

0

Dobra chyba juz ogarniam. Przynajmniej na razie ;p jako ze bardziej rozumiem monitory, to chcialam cos takiego za ich pomoca zrobic - ale NIE implementowac semafor za pomoca monitora, tylko to rozwiazac za pomoca monitorow. Oto kod, ale nie dziala (wypisuje AAAAAAAAAAAAAAAAAA potem BBBBBBBBBBBB i tak w kolko ;(

class Monitor{
	
	private boolean wypiszA = true;
	private boolean wypiszB = false;
	
	public synchronized void startA() throws InterruptedException{
		wypiszA = true;
		while(wypiszB)
			wait();
		System.out.println("A");
		notify();
	}
	
	public synchronized void stopA() throws InterruptedException{
		wypiszA = false;
		notify();
	}
	
	public synchronized void startB() throws InterruptedException{
		wypiszB = true;
		while(wypiszA)
			wait();
		System.out.println("B");
		notify();
	}
	
	public synchronized void stopB() throws InterruptedException{
		wypiszB = false;
		notify();
	}
}

class wypiszA extends Thread{
	
	private Monitor m;
	
	public wypiszA(Monitor m){
		this.m = m;
	}
	
	public void run(){
		
		while(true)
		{
		 try 
		 {
			m.startA();
			m.stopA();
			
		 } catch (InterruptedException e) {}
		 
		}
	}	                  
}

class wypiszB extends Thread{
	
	private Monitor m;
	
	public wypiszB(Monitor m){
		this.m = m;
	}
	
	public void run(){
		
		while(true)
		{
		 try 
		 {
			m.startB();
			m.stopB();
			
		 } catch (InterruptedException e) {}
		}
	}	                  
}

public class MonitoroSemafor {
	 public static void main(String[] args) {
		 Monitor m = new Monitor();
		 wypiszA a = new wypiszA(m);
		 wypiszB b = new wypiszB(m);
		 a.start();
		 b.start();
	 }
	
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1