zoukankan      html  css  js  c++  java
  • wrap ConcurrentDictionary in BlockingCollection

    ConcurrentDictionary<int, BlockingCollection<string>> mailBoxes = new ConcurrentDictionary<int, BlockingCollection<string>>();
            int maxBoxes = 5;
    
            CancellationTokenSource cancelationTokenSource = new CancellationTokenSource();
            CancellationToken cancelationToken = cancelationTokenSource.Token;
    
            Random rnd = new Random();
            // Producer
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    int index = rnd.Next(0, maxBoxes);
                    // put the letter in the mailbox 'index'
                    var box = mailBoxes.GetOrAdd(index, new BlockingCollection<string>());
                    box.Add("some message " + index, cancelationToken);
                    Console.WriteLine("Produced a letter to put in box " + index);
    
                    // Wait simulating a heavy production item.
                    Thread.Sleep(1000);
                }
            });
    
            // Consumer 1
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    int index = rnd.Next(0, maxBoxes);
                    // get the letter in the mailbox 'index'
                    var box = mailBoxes.GetOrAdd(index, new BlockingCollection<string>());
                    var message = box.Take(cancelationToken);
                    Console.WriteLine("Consumed 1: " + message);
    
                    // consume a item cost less than produce it:
                    Thread.Sleep(50);
                }
            });
    
            // Consumer 2
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    int index = rnd.Next(0, maxBoxes);
                    // get the letter in the mailbox 'index'
                    var box = mailBoxes.GetOrAdd(index, new BlockingCollection<string>());
                    var message = box.Take(cancelationToken);
                    Console.WriteLine("Consumed 2: " + message);
    
                    // consume a item cost less than produce it:
                    Thread.Sleep(50);
                }
            });
    
            Console.ReadLine();
            cancelationTokenSource.Cancel();
  • 相关阅读:
    SpringCloud组件---Ribbon
    SpringCloud组件---Eureka
    tomcat及Jetty远程调试debug
    mysql 删除重复数据
    mysql执行SQL语句时报错:[Err] 3
    线程池原理剖析
    上限下限
    线程池Executors、Callable与Future的应用
    spring获取bean(自定义工具类)
    java.util.concurrent.Exchanger应用范例
  • 原文地址:https://www.cnblogs.com/zeroone/p/8043377.html
Copyright © 2011-2022 走看看