• 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();
                }
            }
        }
        
    }
  • 相关阅读:
    《CSOL大灾变》Mobile开发记录——武器音效部分
    MobilePBRLighting优化思路2
    《CSOL大灾变》开发记录——武器购买逻辑开发
    《CSOL大灾变》Mobile开发进度记录——扔掉与拾取武器的逻辑
    《CSOL大灾变》Mobile开发进度记录——武器购买界面设计
    Godot的场景树
    Unity3D发布Android注意事项
    Unity3D——关于质量的设置
    NifytGUI——ListBox控件
    python-PEP8编码规范-中文简版
  • 原文地址:https://www.cnblogs.com/alexcai/p/4171284.html
Copyright © 2020-2023  润新知