Lock锁_线程_线程域
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Lock锁_线程_线程域
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ThreadTest();1、单线程demo
//MoreThread();//2、多线程demo
// LockToMoreThread();//2、lock锁和多线程的使用
ThreadPoolOperation();//线程池的使用
}
#region 1、单线程的创建并使用
/// <summary>
/// 1、创建线程demo
/// </summary>
public void ThreadTest(){
//线程级别都是相等,主线程只是叫主线程,并不是它比其他线程牛逼
//新的参数不懂,一个是看定义,一个是拿着类型百度,还有就是试着new一个或者构造一下
// Thread t1 = new Thread(new ThreadStart(CreateString));//这里时委托,可以采用lambda,还可以其他各种写法,有4种
Thread t1 = new Thread(new ThreadStart(() => {
Console.WriteLine("消息:这 是为了测试线程输出1");
}));//再次记住,委托式是事件的壳
t1.IsBackground = true;//作为后台线程,要不然不会关闭
t1.Start();
int threadId= Thread.CurrentThread.ManagedThreadId;//获取当前线程的信息
Thread.Sleep(1000);//1秒,1000毫秒
t1.Join();//t1 线程阻塞
t1.Abort();//终止线程
}
public void CreateString()
{
Console.WriteLine("消息:这时为了测试线程输出");
}
#endregion
#region 2、多线程,lock的使用
public int AddInt = 0;//全局变量
public object objSync = new object();//锁的指标,每次针对一个不变,要声明一个,要引用类型的,不能是值类型的,这时利用引用类型的特性来操作的,值类型在操作的时候会发生复制,变化,引用类型堆中的数据没变
/// <summary>
/// 2、多线程操作影响变量,所以要使用lock,每次只能一个线程操作,防止多线程的错处
/// </summary>
public void MoreThread()
{
Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i <= 100; i++)
{
AddInt++;
}
}));
t2.IsBackground = true;
t2.Start();
Thread t3 = new Thread(new ThreadStart(() =>
{
for (int i = 100; i > 0; i--)
{
AddInt--;
}
}));
t3.IsBackground = true;
t3.Start();
Console.WriteLine("两个线程操作的结果:" + AddInt);//输出的结果没有一个确定的值,这时由于多个线程同时操作一个变量的结果,没有先后导致的
}
/// <summary>
/// lock锁结合多线程
/// </summary>
public void LockToMoreThread()
{
Thread t2 = new Thread(new ThreadStart(() =>
{
for (int i = 0; i <= 100; i++)
{
lock (objSync)
{
AddInt++;
}
}
}));
t2.IsBackground = true;
t2.Start();
Thread t3 = new Thread(new ThreadStart(() =>
{
for (int i = 100; i > 0; i--)
{
lock (objSync)
{
AddInt--;
}
}
}));
t3.IsBackground = true;
t3.Start();
Console.WriteLine("两个线程操作的结果:" + AddInt);//输出的结果没有一个确定的值,这时由于多个线程同时操作一个变量的结果,没有先后导致的
}
#endregion
#region 3、线程池的使用
/// <summary>
/// 线程池的操作,但是具体线程池掌握在系统手中,没有我们自己手动来创建的好用,有时候如果系统延迟,它的本质的系统自己根据实际情 ///况办的
///
/// </summary>
public void ThreadPoolOperation()
{
//往线程池中加入一个新线程执行方法
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{ //
for (int i = 0; i <= 100; i++)
{
lock (objSync)
{
AddInt++;
}
}
}));
//往线程池中加入第二个线程执行的方法
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{ //
for (int i = 100; i > 0; i--)
{
lock (objSync)
{
AddInt--;
}
}
}));
}
#endregion
}
}
Lock锁_线程_线程域的更多相关文章
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- java多线程 synchronized 与lock锁 实现线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...
- JAVASE(十七) 多线程:程序、进程、线程与线程的生命周期、死锁、单例、同步锁
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.程序.进程.线程的理解 1.1 概念 程序(program)是为完成特定任务.用某种语言编写的一组指 ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- (删)Java线程同步实现二:Lock锁和Condition
在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- Android系统--输入系统(九)Reader线程_核心类及配置文件
Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(十二)Dispatch线程_总体框架
Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...
随机推荐
- C++类:private、public、friend、protected的区别
private和public的作用是让编译器帮你检查某些模块是否使用了他没权限使用的模块,也就是生成可执行代码的时候做权限检查.比如,公司里各个部门有自己私有的信息,财务部可以看所有员工 ...
- Windows系统下的TCP参数优化
1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...
- Expert Shell Scripting
Expert Shell Scripting 好好学习这本书
- 接受、online、见刊时,期刊的 IF 都不同,究竟算发几分期刊?
- Jersey Politics
poj2454:http://poj.org/problem?id=2454 题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k.题解:这道题一开始我并不知道怎么做, ...
- Ombrophobic Bovines
poj2391:http://poj.org/problem?id=2391 题意:一个人有n个农场,每个农场都一个避雨的地方,每个农场有一些牛,每个避雨的地方能容纳牛的数量是有限的.农场之间有一些道 ...
- ibatis报错
关键词:org.springframework.dao.DataIntegrityViolationException 在程序中进行数据库插入操作时报错如下: 未知异常:org.springframe ...
- 【HDOJ】3309 Roll The Cube
BFS,考虑一球进洞仅一球滚动以及两球重叠的情况即可. /* 3309 */ #include <iostream> #include <queue> #include < ...
- PHP去除空白字符
例子1: <?php $var = " This is a beautiful day!"; // 删除字符串中的所有空白字符(不包括全角空格) $var1 = preg_r ...
- Maximum Product Subarray——LeetCode
Find the contiguous subarray within an array (containing at least one number) which has the largest ...