在创建多线程应用程序时,如何确保线程间的协作往往比让线程工作更重要。

线程间的协作最简单的方式是采用Join来进行,如下:

/// <summary>
/// 多线程协作-Join方式
/// 解决线程间同步工作问题
/// </summary>
private static void MultiThreadSynergicWithJoin()
{
int[] array = new int[3];
Thread producer = null, customer = null;
producer = new Thread(() =>
{
Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name));
Random random = new Random();
try
{
array[0] = random.Next(10);
array[1] = random.Next(10);
array[2] = random.Next(10);
Console.WriteLine(String.Format("{0} work over", Thread.CurrentThread.Name));
Thread.Sleep(1000);
}
catch (ThreadAbortException ex)
{
Console.WriteLine(String.Format("Sub Thread {0} Abort", Thread.CurrentThread.Name));
}
})
{
Name = "producer"
};
customer = new Thread(() =>
{
Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name)); try
{
producer.Join();
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
Console.WriteLine(String.Format("{0} work over", Thread.CurrentThread.Name));
}
catch (ThreadInterruptedException ex)
{
Console.WriteLine(String.Format("Sub Thread {0} Interrupted", Thread.CurrentThread.Name));
}
})
{
Name = "customer"
}; Console.WriteLine("Main Thread");
customer.Start();
producer.Start(); Console.WriteLine("Main Thread Wait Sub Thread"); }

说明:

1、在调用producer.Join()时,customer线程将暂停执行而进入等待producer线程执行的过程。在producer线程执行完毕后,customer线程才返回继续执行后续代码。

2、producer与customer谁先启动无所谓,但应保证在调用producer.Join时满足:producer线程必须启动过,即调用过Start方法,如果在调用Join时,被调用线程已经结束或终止,Join方法将立即返回执行后续代码

3、对于多线程间的协作Join方式较为适合线程数量不多,对资源需求有明确先后顺序的情况(个人总结,如有错误,欢迎拍砖)。

C#多线程的用法3-线程间的协作Join的更多相关文章

  1. C#多线程的用法8-线程间的协作AutoResetEvent

    AutoResetEvent自动重置事件,与ManualResetEvent是相对的而言.它同样用于线程间同步,请对照<C#多线程的用法7-线程间的协作ManualResetEvent>进 ...

  2. C#多线程的用法5-线程间的协作Monitor

    之前我们使用lock快捷方式,实现了多线程对同一资源的共享.在C#中lock实际上是Monitor操作的简化版本. 下面使用Monitor来完成之前的lock功能,你可以在此做一下对照: privat ...

  3. C#多线程的用法4-线程间的协作lock快捷方式

    线程间协作还可通过lock(加锁)方式进行,lock属于C#的Monitor语法糖(Monitor后续讲解).使用简单快捷,如下: /// <summary> /// 多线程协作-lock ...

  4. C#多线程的用法7-线程间的协作ManualResetEvent

    ManualResetEvent:手动重置事件,它用于线程间同步时用法非常简单也易于理解. private static void MultiThreadSynergicWithManualReset ...

  5. C#多线程的用法6-线程间的协作Mutex

    Mutex在线程协作的过程中起互斥的左右,效果与线程锁类似. /// <summary> /// 多线程协作-Mutex /// </summary> private stat ...

  6. Java并发之线程间的协作

    上篇文章我们介绍了synchronized关键字,使用它可以有效的解决我们多线程所带来的一些常见问题.例如:竞态条件,内存可见性等.并且,我们也说明了该关键字主要是一个加锁和释放锁的集成,所有为能获得 ...

  7. java并发之线程间通信协作

    在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...

  8. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  9. 【转】Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...

随机推荐

  1. servlet+jsp导入Excel到mysql数据库

    package khservlet; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStr ...

  2. SQl server 2012安装问题 error code 0x858C001b 解决方法

    英文版系统安装中文版sql server的缘故,改安装英文版即可.

  3. var与let的区别

    var与let的区别 前言: 在没接触Es6之前,我们在js中声明都是通过var来声明变量的,var声明变量虽说方便,但是,又有一些自己的诟病,下边来说一说,这三个的区别! var var相信大家都不 ...

  4. Unity-奥义技能背景变黑效果

    [旧博客转移 - 2016年8月29日 12:51 ] 前段时间做了一个放技能的时候,背景缓慢变黑,放完后再变回来的效果,可以很好的突出技能特效的感觉. 算是一种屏幕后期特效,这个特效说难不难,说简单 ...

  5. [CF373C]计算袋鼠是愉快的(Counting Kangaroos is Fun)-贪心

    Problem 计算袋鼠是愉快的 题目大意 有n只袋鼠,如果一个袋鼠体积是另一个袋鼠的两倍或以上,则小袋鼠能被大袋鼠装进袋子里,装进去后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最 ...

  6. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

  7. Selenium webdriver定位iframe里面元素两种方法

    以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...

  8. Ambari安装之部署本地库(镜像服务器)(二)

    部署本地库(镜像服务器) (1)下载HortWorks官网上的3个库到本地(也可以在线下载,但是速度会很慢) 我们先把hortworks官网上需要下载的3个库下载到本地(这个还是需要很长时间的,当然你 ...

  9. 【转载】CANoe 入门 Step by step系列(三)简单例子的剖析

    来源:http://www.cnblogs.com/dongdonghuihui/archive/2012/09/26/2704623.html 最好的学习方式是什么?模仿.有人会问,那不是山寨么?但 ...

  10. Exception in thread "http-bio-8080-exec-2" java.lang.OutOfMemoryError: PermGen space[解决方案]