首页 > 代码库 > JAVA信号量使用示例程序

JAVA信号量使用示例程序

JAVA里也有强大的信号量工具Semaphore,使用信号量可以很方便的实现线程同步功能,以解决类似于 生产者——消费者 之类的典型问题。

下面是我的测试程序,大部分看注释就可以明白用法:

 

import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.Semaphore;public class TestSemaphore {    /**     * 测试主程序     */    public static void main(String[] args) {        TestSemaphore t = new TestSemaphore();        t.runTest();    }    //TestSemaphore    /**信号量*/    private Semaphore mSem = new Semaphore(0);    /**产生的产品队列*/    private Queue<String> mQueue = new LinkedList<String>();        /**     * 进行测试     */    public void runTest() {        Runnable runProvider = new Runnable() {            @Override            public void run() {                provider();            }        };                Runnable runCustomer = new Runnable() {            @Override            public void run() {                customer();            }        };                new Thread(runCustomer).start();        new Thread(runProvider).start();                while(true) {            try {                Thread.sleep(300);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }        /**     * 生产者线程     */    public void provider() {        for(int i = 0; i < 10; i++) {            //生成一个产品,放到队列里            String p = String.format("product_%d", i);            mQueue.offer(p);            System.out.println(String.format("Send sig >>>>>>>>>>>>> %s", p));                        //发出信号量            mSem.release();                        try {                Thread.sleep(300);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }        /**     * 消费者线程     */    public void customer() {        while(true) {            //等待信号量            try {                mSem.acquire();            } catch (InterruptedException e) {                e.printStackTrace();            }                        //从队列里取出一个产品            String s = mQueue.poll();            System.out.println(String.format("Get sig : %s", s));                        try {                Thread.sleep(500);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    }

 

JAVA信号量使用示例程序