学习记录。仅供参考。

知识点:

  1. 多线程
  2. Lock

环境:

  1. Visual Studio 2017

     public partial class Form1 : Form
{
private static readonly ConcurrentDictionary<int, bool> SourceDic = new ConcurrentDictionary<int, bool>(); //存放数字的字典 标记为True 表示已占用,不能再使用我 private static readonly ConcurrentDictionary<int, int> ResultDic = new ConcurrentDictionary<int, int>(); //存放UI页面上次存放的数字 通过Label的Id 保存最后的结果值 private static readonly Random Random = new Random(); //随机数 private CancellationTokenSource _cts = new CancellationTokenSource(); //取消信号源 private static readonly object LockObj = new object();//锁 static Form1()//静态构造
{
foreach (var i in Enumerable.Range(, ))
{
SourceDic.TryAdd(i, false);
} foreach (var i in Enumerable.Range(, ))
{
ResultDic.TryAdd(i, i); //1,2,3,4,5,6,7
}
} public Form1()//构造函数
{
InitializeComponent();
} //开始按钮
private void btnStart_Click(object sender, EventArgs e)
{
if (_cts.IsCancellationRequested)
{
_cts = new CancellationTokenSource(); //重新生成cts
} btnStart.Enabled = false;
btnEnd.Enabled = true; foreach (var i in Enumerable.Range(, ))
{
Task.Factory.StartNew(o =>
{
var controlId = Convert.ToInt32(o);
while (!_cts.IsCancellationRequested)
{
if (controlId == )//==7表示是绿球
{
ResultDic.TryGetValue(, out var value);
ResultDic.TryUpdate(, Random.Next(, ), value);
}
else
{
var oldValueKey = ResultDic.GetOrAdd(controlId, controlId);
var newValueKey = GetNonDuplicate(oldValueKey);
ResultDic.TryUpdate(controlId, newValueKey, oldValueKey);
} UpdateLabel(controlId);
Thread.Sleep(Random.Next(, ));//1-5毫秒随机停顿
}
}, i);
}
} //结束按钮
private void btnEnd_Click(object sender, EventArgs e)
{
btnStart.Enabled = true;
btnEnd.Enabled = false; _cts.Cancel();
} //获取不重复数字
private static int GetNonDuplicate(int oldKey)
{
int key;
lock (LockObj)
{
do
{
key = Random.Next(, );
} while (oldKey == key || SourceDic.GetOrAdd(key, true)); //true表示被占用 再次重新获取 SourceDic.TryUpdate(oldKey, false, true); //清除占用
SourceDic.TryUpdate(key, true, false); ////占用
} return key;
} //更新Label
private void UpdateLabel(int controlId)
{
var action = new Action(() =>
{
if (this.Controls["label" + controlId] is Label label)
{
label.Text = ResultDic[controlId].ToString();
} //前6个数字有值相等 报异常
if (ResultDic.Take().Select(x => x.Value).Distinct().Count() != )
{
throw new Exception("前6位有重复值");
}
}); this.Invoke(action);
}
}

效果如图:

c# 多线程 双色球的更多相关文章

  1. 利用jsoup爬取百度网盘资源分享连接(多线程)

    突然有一天就想说能不能用某种方法把百度网盘上分享的资源连接抓取下来,于是就动手了.知乎上有人说过最好的方法就是http://pan.baidu.com/wap抓取,一看果然链接后面的uk值是一串数字, ...

  2. 2018.4.17 java多线程练习二模拟开场仪式进场

    2.某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线程 ...

  3. Java 多线程练习

    题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线 ...

  4. 多线程中Runnable 和Thread关于synchronized的疑点

    学java时和同学碰到的一道题: 转自https://blog.csdn.net/qq_40857349/article/details/102809100 某公司组织年会,会议入场时有两个入口,在入 ...

  5. 多线程之旅(Task 任务)

    一.Task(任务)和ThreadPool(线程池)不同       源码 1.线程(Thread)是创建并发工具的底层类,但是在前几篇文章中我们介绍了Thread的特点,和实例.可以很明显发现局限性 ...

  6. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  7. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  8. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  9. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

随机推荐

  1. golang数据结构之选择排序

    //SelectSort 选择排序 func SelectSort(arr *[]int) { ; i < len(arr); i++ { tmp := arr[i] index := i ; ...

  2. 【JS】JS实现Html转义和反转义(html编码和解码)的方法总结

    1.JS实现html转义和反转义主要有两种方式: 1).利用用浏览器内部转换器实现html转义: 2).用正则表达式实现html转义: 2.封装的JS工具类: var HtmlUtil = { /*1 ...

  3. Spring案例--打印机

    目录: 1.applicationContext.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> &l ...

  4. H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: <!DOCTYPE html> <html> <head> <title></title> < ...

  5. POJ 1724 (分层图最短路)

    ### POJ 1724 题目链接 ### 题目大意: 给你 N 个点 ,M 条有向路,走每条路需要花费 C 元,这段路的长度为 L . 给你 K 元,问你能否从 1 走到 N 点且花费不超过 K 元 ...

  6. pixijs shader 案例

    pixijs shader 案例 const app = new PIXI.Application({ transparent: true }); document.body.appendChild( ...

  7. H3C DRNI学习

    DRNI:Distributed Resilient Network Interconnect,分布式弹性网络互连.DR:分布式聚合接口IPP:内部控制链路端口IPL:内部控制链路DRCP报文:分布式 ...

  8. 数据库之MySQL与Python交互

    准备数据 创建数据表 -- 创建 "京东" 数据库 create database jing_dong charset=utf8; -- 使用 "京东" 数据库 ...

  9. SpringBoot(14)—注解装配Bean

    SpringBoot(14)-注解装配Bean SpringBoot装配Bean方式主要有两种 通过Java配置文件@Bean的方式定义Bean. 通过注解扫描的方式@Component/@Compo ...

  10. [目录] -- 计划翻译一些有关CLR/C#的基础内容,希望能坚持下去

    主要内容有以下部分(URL待补充): CLR 和Windows Loader 加载.NET Assembly的过程 CLR加载失败分析分析 Windows内存架构模型,分配内存及垃圾回收 其他带补充的 ...