zoukankan      html  css  js  c++  java
  • 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
    }
    }

  • 相关阅读:
    appfabric cache配置,实验记录
    appfabric cache存储ef 查询结果的bug
    CruiseControl.NET svn获取 自动编译 ftp上传
    @Ajax.RenderAction 把局部页改为ajax加载
    分布式架构下的mvc 异步controller ajax comet 长连接
    win7重装iis,搞死
    验证码识别的基本思路及方法
    C# 获取程序当前文件夹
    在c#中 限制文本框只能输入数字
    string字符串 获取指定位置范围的子字符串
  • 原文地址:https://www.cnblogs.com/linbin524/p/4767029.html
Copyright © 2011-2022 走看看