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多线程
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程 ...
随机推荐
- iOS: 线程中那些常见的锁
一.介绍 在多线程开发中,锁的使用基本必不可少,主要是为了解决资源共享时出现争夺而导致数据不一致的问题,也就是线程安全问题.锁的种类很多,在实际开发中,需要根据情况选择性的选取使用,毕竟使用锁也是消耗 ...
- 17-REST framework-Request与Response
1.Django REST framework提供的视图的主要作用 1.控制序列化器的执行(检验,保存,转换数据) 2.控制数据库查询的执行 Request与Response 1.Request RE ...
- Koa 中间件的执行
Node.js 中请求的处理 讨论 Koa 中间件前,先看原生 Node.js 中是如何创建 server 和处理请求的. node_server.js const http = require(&q ...
- 深入理解JVM,虚拟机类加载机制
类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Re ...
- Javase之object类的概述
object类的概述 object类是类层次结构的根类,每个类都使用object作为超类. 即每个类都直接或间接的继承object类. object类中方法介绍 hashCode public int ...
- 双十一DIY装机记
一.装机背景 最近发现古董笔记本太卡了,用了近6年,尽管自己不打游戏,但是业余时间写写代码,同时开两个编辑器,打开个大一点的软件都卡的不行,据说更换固态硬盘可以提高速度,于是乎,京东买了一个500 ...
- 什么是POSP?系统逻辑是什么?pos收单必读
POSProxy,POS前置系统.主要用于管理前端的POS机具和交易的转发,具体功能有: 1. POS机具的密钥及下载管理: 2. 交易的合法检测和过滤: 3. 交易监控和分流: 4. ...
- 禁止ViewPager滑动
实现如下: public class NoScrollViewPager extends ViewPager { public NoScrollViewPager (Context context) ...
- Element-ui中为上传组件添加表单校验
vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...
- 记录Flex布局的属性
容器属性 flex-dirextion(主轴的方向):>>row(水平) | row-reverse(水平取反) | column(垂直) | column-reverse(垂直取反) f ...