学习记录。仅供参考。

知识点:

  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. 《大数据技术应用与原理》第二版-第二章大数据处理架构Hadoop

    2.1概述 Hadoop是Apache旗下的开源分布式计算平台,是基于Java开发的,具有很好的跨平台特性,其中核心文件是MapReduce和HDFS,而HDFS是根据谷歌文件系统GFS开源实现,是面 ...

  2. js判断浏览器是否安装或启用了flash的方法总结

    目录 # js判断浏览器是否安装或启用了flash的方法 # chrome浏览器启用flash插件的方法 # 参考 # js判断浏览器是否安装或启用了flash的方法 在传统浏览器,可以使用windo ...

  3. js函数只执行一次,函数重写,变量控制与闭包三种做法

    一.情景需求 调用后台接口需要附带token信息,那么在每个请求的头部添加token的做法就不太优雅了:一个网站请求100次,那就得写添加100次token,假设某天接口有所变动,改起来就十分麻烦了. ...

  4. springboot-热部署Jrebel

    1. 场景描述 介绍下idea+springboot下的热部署插件-Jrebel,贼好用,以前用过好多种,但是总出现不稳定或者会莫名其妙的没有部署新代码. 2.解决方案 springboot自带的de ...

  5. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 11

    23.6  使用第三方接口服务实例 接供服务的第三方接口平台有很多,现在的项目中也经常用到一些第三方接口,如支付宝.微信.短信.邮件接口等,我们需要借助第三方的能力来实现产品的某些功能.如果自己已经掌 ...

  6. selenium元素定位方法之轴定位

    一.轴运算名称 ancestor:祖先结点(包括父结点) parent:父结点 preceding:当前元素节点标签之前的所有结点(html页面先后顺序) preceding-sibling:当前元素 ...

  7. [04]ASP.NET Core Web 项目文件

    ASP.NET Core Web 项目文件 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ASP.NET ...

  8. C#上手练习7(方法语句2)

    上一篇方法调用赋值封装,这里使用封装后调用,尽量满足开闭原则. 以及静态类的使用. using System; namespace KingTest03 { class Program { int a ...

  9. Android应用图标尺寸以及drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

    应用图标: L DPI ( Low Density Screen,120 DPI ),其图标大小为 36 x 36 px M DPI ( Medium Density Screen, 160 DPI ...

  10. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...