Lock锁_线程_线程域

时间:2022-09-04 10:43:54

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锁_线程_线程域的更多相关文章

  1. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知&lpar;signal&rpar;

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  2. java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...

  3. JAVASE&lpar;十七&rpar; 多线程:程序、进程、线程与线程的生命周期、死锁、单例、同步锁

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.程序.进程.线程的理解 1.1 概念 程序(program)是为完成特定任务.用某种语言编写的一组指 ...

  4. Android系统--输入系统(十一)Reader线程&lowbar;简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  5. (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...

  6. Android系统--输入系统(八)Reader线程&lowbar;使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  7. Android系统--输入系统(九)Reader线程&lowbar;核心类及配置文件

    Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...

  8. Android系统--输入系统(十)Reader线程&lowbar;核心类及配置文件深入分析

    Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...

  9. Android系统--输入系统(十二)Dispatch线程&lowbar;总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

随机推荐

  1. 新创建的项目利用git添加远程仓库

    git initgit remote add origin https:// //git账号中的网址 (git remote //可以查询添加的远程仓库) git add . //添加刚刚导入的整个工 ...

  2. Java 数据库编程 ResultSet 的 使用方法

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...

  3. android渠道打包怎样实现最方便

    我们都知道,Android 市场被分割成几十个应用商店渠道,程序员给渠道打包.更新是一件异常繁杂又不得不做的工作,但现在有一种快捷灵活的免费多渠道统计方式,能最大程度的提高打包效率和数据安全性. 首先 ...

  4. netty 学习&lpar;1&rpar;

    Netty使用:通过BootStrap来启动.而BootStrap主要分为两类:1.面向连接(TCP)的(ClientBootStrap和ServerBootStrap);2. 非面向连接(UDP)的 ...

  5. 单元测试系列之二:Mock工具Jmockit实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  6. laravel代码生成器的记录

    在使用laravel5.5时,关于代码生成器还有很多的功能不明白 是么回事,在此先记录下来过程. 1.composer reqiure summerblue/generator --dev php a ...

  7. Shell脚本管理

    sh test.sh../test.sh与source test.sh.. test.sh执行命令的区别:sh是启用子shell执行而source或点是在当前窗口执行export A=123:定义全局 ...

  8. hibernate中的sql 1&plus;n 问题

    ( 产生的原因:当一对多或多对多的映射关系下,当在一方添加或修改数据时,一方集合属性中的多方都要发生变化;先select语句,再update语句.当一方集合属性中的数据有很多时,对应的update语句 ...

  9. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2&period;搭建环境-2&period;9&period;&Tab;配置用户等效性&lpar;可选项&rpar;

    2.9.配置用户等效性(可选项) Oracle 11g r2 ssh也可以在安装过程中配置. 2.9.1. grid用户等效性 1.以下均以grid用户执行: 在两个节点的grid主目录分别创建.ss ...

  10. &commat;CrossOrigin 跨域注解

    在spring 4.2后,提供了跨域注解@CrossOrigin https://spring.io/guides/gs/rest-service-cors/ Enabling CORS Contro ...