zoukankan      html  css  js  c++  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();
                }
            }
        }
        
    }
  • 相关阅读:
    pktgen使用指南
    常见的网卡调优
    网络PPS测试
    网络性能测试工具qperf
    设置虚拟机静态IP
    superset填坑
    js格式化
    《你不知道的JavaScript》读书笔记(一):JS是如何查找变量的
    技术分享PPT整理(三):网页渲染流程
    技术分享PPT整理(二):C#常用类型与数据结构
  • 原文地址:https://www.cnblogs.com/alexcai/p/4171284.html
Copyright © 2011-2022 走看看