Java/Threads/Semaphore

Материал из Java эксперт
Перейти к: навигация, поиск

An implementation of a producer and consumer that use semaphores to control synchronization.

   
   
import java.util.concurrent.Semaphore;
class Queue {
  int value;
  static Semaphore semCon = new Semaphore(0);
  static Semaphore semProd = new Semaphore(1);
  void get() {
    try {
      semCon.acquire();
    } catch (InterruptedException e) {
      System.out.println("InterruptedException caught");
    }
    System.out.println("Got: " + value);
    semProd.release();
  }
  void put(int n) {
    try {
      semProd.acquire();
    } catch (InterruptedException e) {
      System.out.println("InterruptedException caught");
    }
    this.value = n;
    System.out.println("Put: " + n);
    semCon.release();
  }
}
class Producer implements Runnable {
  Queue q;
  Producer(Queue q) {
    this.q = q;
    new Thread(this, "Producer").start();
  }
  public void run() {
    for (int i = 0; i < 20; i++)
      q.put(i);
  }
}
class Consumer implements Runnable {
  Queue q;
  Consumer(Queue q) {
    this.q = q;
    new Thread(this, "Consumer").start();
  }
  public void run() {
    for (int i = 0; i < 20; i++)
      q.get();
  }
}
public class ProdCon {
  public static void main(String args[]) {
    Queue q = new Queue();
    new Consumer(q);
    new Producer(q);
  }
}





A semaphore

  
import java.util.concurrent.Semaphore;
public class Main {
  public static void main(String args[]) throws Exception {
    Semaphore sem = new Semaphore(1, true);
    Thread thrdA = new Thread(new SyncOutput(sem, "Message 1"));
    Thread thrdB = new Thread(new SyncOutput(sem, "Message 2!"));
    thrdA.start();
    thrdB.start();
    thrdA.join();
    thrdB.join();
  }
}
class SyncOutput implements Runnable {
  Semaphore sem;
  String msg;
  SyncOutput(Semaphore s, String m) {
    sem = s;
    msg = m;
  }
  public void run() {
    try {
      sem.acquire();
      System.out.println(msg);
      Thread.sleep(10);
    } catch (Exception exc) {
      System.out.println("Error Writing File");
    }
    sem.release();
  }
}





Semaphore that can allow a specified number of threads to enter, blocking the others.

 
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
/**
 * Semaphore that can allow a specified number of threads to enter, blocking the
 * others. If the specified number of threads is 1, it acts as an exclusive
 * semaphore and can be used instead of synchronized blocks
 * 
 * @author 
 * @version $Revision: 2787 $
 */
interface Sync {
  /**
   * Acquires this sync
   * 
   * @see #release
   * @throws InterruptedException
   */
  void acquire() throws InterruptedException;
  /**
   * Releases this sync
   * 
   * @see #acquire
   */
  void release();
}





Wait exclusive semaphore with wait - notify primitives

 
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
/*
 * JBoss, Home of Professional Open Source Copyright 2005, JBoss Inc., and
 * individual contributors as indicated by the @authors tag. See the
 * copyright.txt in the distribution for a full listing of individual
 * contributors.
 * 
 * This is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This software is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this software; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
 * site: http://www.fsf.org.
 */
/**
 * Wait exclusive semaphore with wait - notify primitives
 * 
 * @author 
 * @version $Revision: 2787 $
 */
interface WaitSync extends Sync {
  /**
   * Pone in wait status this sync, until {@link #doNotify} is called to wake it
   * up.
   * 
   * @see #doNotify
   * @throws InterruptedException
   */
  void doWait() throws InterruptedException;
  /**
   * Wakes up this sync that has been posed in wait status by a {@link #doWait}
   * call. If this sync is not waiting, invoking this method should have no
   * effect.
   * 
   * @see #doWait
   * @throws InterruptedException
   */
  void doNotify() throws InterruptedException;
}