文档章节

线程间同步与多线程

马知常
 马知常
发布于 2014/08/14 16:32
字数 392
阅读 16
收藏 0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication1
{

    /// <summary>
    /// 此类使用了ManualResetEvent,和AutoResetEvent
    /// 功能一:ManualResetEvent用于,等待所有线程结束再执行
    /// 功能二:AutoResetEvent用于线程间的同步
    /// </summary>
    class Program
    {
        #region === Filed ===
        //定义两个资源
        static int nSubOne = 20; 
        static int nSubTwo = 15;
        //设置手动重置信号量
        ManualResetEvent manA ;
        ManualResetEvent manB ;

        //设置自动重置信号量
        AutoResetEvent ateA = new AutoResetEvent(false);
        AutoResetEvent ateB = new AutoResetEvent(false);
        #endregion === Filed ===

        #region === Main Method ===

        static void Main(string[] args)
        {
            Program pg = new Program();
            pg.ThreadTest();
        }

        #endregion === Main Method ===

        #region === Private Method ===
        void ThreadTest()
        {
            //初始化信号量
            manA = new ManualResetEvent(false);
            manB = new ManualResetEvent(false);
            //启动两个线程
            Thread thdOne = new Thread(new ThreadStart(ThreadOne));
            thdOne.Start();
            Thread thdTwo = new Thread(new ThreadStart(ThreadTwo));
            thdTwo.Start();

            //等信号量manA,manB都释放了,才执行主线程
            WaitHandle.WaitAll(new WaitHandle[2] { manA, manB });
            int n = 0;
            while (n < 10)
            {
                Debug.Print(n++.ToString());
                Thread.Sleep(50);
            }
        }
        void ThreadOne()
        {           
            while (nSubOne > 0)
            {
                ateA.WaitOne();   //ateA保持等待
                Debug.Print("T___1___:" + nSubOne--);
                ateB.Set(); //给ateB一个开始信号        
                //Thread.Sleep(500);  //可以看出,线程一和线程2的Sleep时间并不一样,但是结果仍然是对的,        
                                    //这就是我们设置的同步信号量AutoResetEvent ateA,ateB的效果               
            }
            manA.Set();  //给manA一个开始信号  
        }
        void ThreadTwo()
        {
            ateA.Set();    //给ateA一个开始信号        
            //while (nSubTwo > 0)  //可以在这试一下另一个线程操作,看是否主线程的确是等所有其它线程都执行完成才执行的.
                                   //即看一下WaitHandle.WaitAll是否是真的有效了.
            while (nSubOne > 0)
            {
                ateB.WaitOne();  //ateB保持等待
                //Console.WriteLine("T___2___:" + nSubTwo--);
                Debug.Print("T___2___:" + nSubOne--);
                ateA.Set();      //给ateA一个开始信号        
                //Thread.Sleep(50);               
            }
            manB.Set(); //给manB一个开始信号  
        }
        #endregion === Custom Method ===
    
    }
}



本文转载自:

马知常
粉丝 18
博文 141
码字总数 197196
作品 0
南京
程序员
私信 提问
synchronized与ThreadLocal

synchronized是实现java的同步机制。同步机制是为了实现同步多线程对相同资源的并发访问控制。保证多线程之间的通信。 同步的主要目的是保证多线程间的数据共享。同步会带来巨大的性能开销,...

bigYuan
2013/07/18
599
2
求javaweb方向的前辈们戳入,学生党求指导~

java中有所谓的“单线程”、“多线程”、“线程同步”等概念,说一下我个人的一些理解,不知道正不正确,不正确的话还望前辈们指出,先谢谢了~ 所谓单线程就是指整个程序运行过程中只有一个线...

上帝爱众生
2015/04/21
132
3
Python标准库08 多线程与同步 (threading包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Python主要通过标准库中的threading包来实现多线程。在当今网络时代,每个服务器都会接收到大量的请求...

osDaniel
2014/09/21
34
0
Java并发编程序列之线程间通讯-synchronized关键字-volatile关键字

Java并发编程序列之线程间通讯-synchronized关键字-volatile关键字 Hello,大家好,今天开始Java并发编程序列的第二篇,该篇主要讲解如何使用synchronized实现同步,以及volatile关键字的作用...

2017/12/19
0
0
秒杀多线程第四篇 一个经典的多线程同步问题

上一篇《秒杀多线程第三篇原子操作 Interlocked系列函数》中介绍了原子操作在多进程中的作用,现在来个复杂点的。这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果...

长平狐
2012/12/10
48
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
41分钟前
10
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
54分钟前
688
23
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
今天
6
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部