Ar dirbote su šviesoforais savo praktikoje?
sobes.tech AI
Atsakymas iš AI
Taip, naudojau semaforus, ypač dirbdamas su daugiabriauniais Android programų procesais.
Java kalboje (java.util.concurrent.Semaphore) semaforai naudojami riboti, kiek sruogų gali vienu metu pasiekti tam tikrą išteklių. Tai naudinga scenarijuose, kur ištekliai turi ribotą "talpą", pavyzdžiui, ryšių baseinas arba ribotas prieinamų vietų skaičius.
Pagrindiniai metodai, su kuriais dirbau:
acquire(): blokuoja dabartinę sruogą, kol bus pasiekiamas leidimas.acquire(int permits): blokuoja dabartinę sruogą, kol bus pasiekiamas nurodytas leidimų skaičius.release(): grąžina leidimą semaforui, padidindamas prieinamų leidimų skaičių.release(int permits): grąžina nurodytą leidimų skaičių.tryAcquire(): bando gauti leidimą, neblokuodamas sruogos.availablePermits(): grąžina dabartinį prieinamų leidimų skaičių.
Pavyzdys naudojimo:
import java.util.concurrent.Semaphore;
public class ResourcePool {
private static final int MAX_AVAILABLE = 5;
private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Teisingas semaforas
public void useResource() throws InterruptedException {
permits.acquire(); // Leidimo prašymas
try {
// Išteklių naudojimo logika (pavyzdžiui, ryšių baseino darbai)
System.out.println(Thread.currentThread().getName() + " naudoja išteklių.");
Thread.sleep(1000); // Darbo su ištekliais imitacija
} finally {
permits.release(); // Leidimo atlaisvinimas
System.out.println(Thread.currentThread().getName() + " baigė naudoti išteklius.");
}
}
public static void main(String[] args) {
ResourcePool pool = new ResourcePool();
// Sukuriame kelis sruogų, kurios bandys naudoti išteklius
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
pool.useResource();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
Šiame pavyzdyje semaforas permits inicializuotas su 5 leidimais, tai reiškia, kad vienu metu tik 5 sruogos gali būti try bloko viduje, naudojančios išteklius. acquire() metodas blokuoja sruogas, jei visi leidimai užimti, kol kitos sruogos neiškvies release().
Semaforai naudingi ribotų išteklių baseinų valdymui, tačiau reikia būti atsargiems dėl galimų problemų, tokių kaip deadlock, jei netinkamai valdome leidimų gavimą ir atlaisvinimą. try su finally naudojimas release() kvietimui yra gera praktika, užtikrinanti išteklių atlaisvinimą net ir išimčių atvejais.