Before getting a resource the thread must acquire a permit form a semaphore and release the resource after using the shared resource which can be memory, storage or data.
Constructors
Semaphore ( i n t permits )Creates a Semaphore with the given number of permits and no fair fairness setting .
Semaphore ( i n t permits , boolean fair )
Creates a Semaphore with the given number of permits and the given fairness setting .
Now for a sample semaphore program that counts until 20 using two threads that uses semaphores for data consistency.
Counter.java |
---|
import java.util.concurrent.Semaphore; import javax.swing.JTextArea; public class Counter extends Thread{ private static int count=0; private String ID; private JTextArea TBox; private Semaphore sem; public ServiceQueue(String name,JTextArea jArea, Semaphore s){ ID=name; TBox=jArea; sem=s; } private void nonCrit(int i){ System.out.println(ID+" is not in critical: "+i); } private synchronized void doCrit(){ count++; TBox.append(ID+" gave count: "+count+"\n"); } public void run(){ for(int ctr=0;ctr<10;ctr++){ nonCrit(ctr); try{ sem.acquire(); } catch (InterruptedException e){ } doCrit(); sem.release(); } } } |
Executioner.java |
---|
import javax.swing.*; import java.util.concurrent.Semaphore; import java.awt.*; public class Executioner extends JFrame{ public Executioner(){ super("Hello World"); JTextArea TA=new JTextArea(20,15); Semaphore sem = new Semaphore(3, true); setLayout(new FlowLayout()); add(TA); Counter Q1=new ServiceQueue("1st Class",TA,sem); Counter Q2=new ServiceQueue("3rd Class",TA,sem); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); C1.start(); C2.start(); pack(); } public static void main(String args[]){ new Executioner(); } } |
No comments:
Post a Comment