学习记录。仅供参考。

知识点:

  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. C++入门到理解阶段二基础篇(1)——简介与环境安装

    1.C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点. ...

  2. python基础(8):基本数据类型三(dict)、is和==、编码和解码

    1. 字典 1.1 字典的介绍 字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成.在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将k ...

  3. Java生鲜电商平台-电商订单系统全解析

    Java生鲜电商平台-电商订单系统全解析 说明:Java生鲜电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识. 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订 ...

  4. Java日期时间API系列1-----Jdk7及以前的日期时间类

    先看一个简单的图: 主要的类有: Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为 ...

  5. 在Vue-cli3.x中引入element-ui的新方式

    今天登上element官网,发现element对vue-cli3.x的项目做了特殊定制: 这意味着即使是按需引入,也无需像过去那样手动安装babel-plugin-component,配置babel. ...

  6. YYLable 的使用 以及注意点

    NSString *title = @"不得不说 YYKit第三方框架确实很牛,YYLabel在富文本显示和操作方面相当强大,尤其是其异步渲染,让界面要多流畅有多流畅,这里我们介绍下简单的使 ...

  7. Springboot中定时器的简单使用

    在定时器的类上添加注解: @Component@EnableAsync@EnableScheduling 一.普通的定时器: 每天15:10执行的定时器 @Scheduled(cron="0 ...

  8. Oracle 导入dmp 故障存储文件

    创建表空间及用户CREATE TABLESPACE OracleDBFDATAFILE 'D:\app\zhoulx\oradata\bdc\OracleDBF.DBF' SIZE 100M AUTO ...

  9. Linux—各种重要配置文件详解

    一./etc/profile文件详解(环境变量) 添加环境变量 .编辑profile文件 [root@localhost ~]# vi /etc/profile .在profile文件中添加如下内容 ...

  10. k8s资产清单(二)

    什么是清单 说白了清单是k8s当中用来定义pod的文件,语法格式遵循yaml语法,在yaml当中可以定义控制器类型,元数据,容器端口号等等等....,也可以针对于清单对pod进行删除等操作 为什么太学 ...