c# 多线程 双色球
学习记录。仅供参考。
知识点:
- 多线程
- Lock
环境:
- 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# 多线程 双色球的更多相关文章
- 利用jsoup爬取百度网盘资源分享连接(多线程)
突然有一天就想说能不能用某种方法把百度网盘上分享的资源连接抓取下来,于是就动手了.知乎上有人说过最好的方法就是http://pan.baidu.com/wap抓取,一看果然链接后面的uk值是一串数字, ...
- 2018.4.17 java多线程练习二模拟开场仪式进场
2.某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线程 ...
- Java 多线程练习
题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线 ...
- 多线程中Runnable 和Thread关于synchronized的疑点
学java时和同学碰到的一道题: 转自https://blog.csdn.net/qq_40857349/article/details/102809100 某公司组织年会,会议入场时有两个入口,在入 ...
- 多线程之旅(Task 任务)
一.Task(任务)和ThreadPool(线程池)不同 源码 1.线程(Thread)是创建并发工具的底层类,但是在前几篇文章中我们介绍了Thread的特点,和实例.可以很明显发现局限性 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java多线程
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程 ...
随机推荐
- Paper | PyTorch: An Imperative Style, High-Performance Deep Learning Library
目录 0. 摘要 1. 简介 2. 背景 3. 设计原则 4. 针对易用性的核心设计 4.1 让深度学习模块不过是Python程序 4.2 互用性和可拓展性 4.3 自动差分 5. 针对高性能的PyT ...
- golang数据结构之散哈希表(Hash)
hash.go package hash import ( "fmt" ) type Emp struct { ID int Name string Next *Emp } //第 ...
- PostgreSQL 12 YUM安装
目录 1.创建postgres用户 2.查看操作系统版本 3.配置yum源(对应CentOS 6) 4.安装客户端包 5.安装服务器端包 6.初始化数据库和设置自启动服务 7.postgres用户的b ...
- ASP.NET 数据绑定
控件绑定数据源控件手动方式: DataSourceID = 数据源控件名称下拉框绑定 A.设置Datasource B.DataTextField="name"' //显示的值 C ...
- Zookeeper学习记录及Java客户端连接示例
1. Zookeeper 1.1 简介 ZooKeeper is a centralized service for maintaining configuration information, na ...
- web开发中移动端适配
这个话题有些复杂,说起来有些琐碎,因为和移动端适配相关的问题太多了. 1. 概念 1.1 设备像素 设备像素被称为物理像素,它是显示设备中一个最小的物理部件.每个像素可以根据操作系统设置自己的颜色和亮 ...
- java war包 路径--解决war包中文件路径问题
https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...
- PHP获取网址详情页的内容导出到WORD文件
亲自测试效果一般, css的样式文件获取不到 如果没有特殊的样式 或者是内容里面包括样式的 直接输出有样式的内容 然后导出 这样还是可以的 class word { function start ...
- oracle学习笔记(二十三)——JDBC调用存储过程以及批量操作
jdbc调用存储过程 使用并获得out模式的参数返回值 //存储过程为sum_sal(deptno department.deptno%type,sum in out number) Callable ...
- python基础(8):基本数据类型三(dict)、is和==、编码和解码
1. 字典 1.1 字典的介绍 字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成.在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将k ...