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)与通知(signal)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. ubuntu 查本机 ip地址的命令是什么, 详细信息的?

    使用ifconfig命令即可.你一敲进去都出来了

  2. Qt tip 网络请求 QNetworkRequest QJason 处理 JSON

    http://blog.csdn.net/linbounconstraint/article/details/52399415 http://download.csdn.net/detail/linb ...

  3. poj1980

    首先想到费用流,但m<=100000还是算了吧那就感觉要用dp了,首先将a,b排序贪心一下可知,a,b的配对肯定不可能出现交叉这样就可以dp了,复杂度O(nm)还是过不去在贪心一下会发现,对于a ...

  4. 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions

    题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...

  5. 【模拟】Vijos P1005 超长数字串

    题目链接: https://vijos.org/p/1005 题目大意: 无限的正整数按顺序拼接成字符串S(S=12345678910111213...),给你一个字符串A(len<=200)求 ...

  6. MFC 显示CImg图片

    很多示例关于CImg都是基于控制台的,如何把它用于MFC中显示. Problem:直接按照控制台示例写入MFC程序中,当程序执行完display后,其后面的代码便不再执行. solution:开辟新的 ...

  7. bzoj 1089 [SCOI2003]严格n元树(DP+高精度)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1250  Solved: 621[Submit][Statu ...

  8. (转)【C++ STL】细数C++ STL 的那些事 -- priority_queue(优先队列)

    装载自http://blog.csdn.net/tianshuai1111/article/details/7652553 一,概述 priority_queue是拥有权值观念的queue,它允许加入 ...

  9. C#中格式化数据的输出

    格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...

  10. slidingmenu+fragment实现经常使用的側滑效果(包含Fragment状态的保存)

    一.需求 关于fragment的问题,一直想写一篇博客了.应该当初自己也是对这玩意一点都不熟悉到如今也大概知道个日常的使用的地步. 一个側滑的导航栏,内有4个条目.每个选项点击进入相应的界面,每个界面 ...