传递数据给一个线程

  • 通过函数或lambda表达式包一层进行传递。
static void Main(string[] args)
{
Thread thread = new Thread(() => { threadOne("hello world"); });
thread.Start();
Console.ReadKey();
} static void threadOne(string content)
{
lib.print(content);
}
  • 另外一种方式是传递一个参数给ThreadStart方法:
static void Main(string[] args)
{
Thread thread = new Thread(threadOne);
thread.Start("hello world");
Console.ReadKey();
} static void threadOne(object content)
{
lib.print(content);
}
  • 注意传递的数据的可靠性。
static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
new Thread(() =>
{
lib.put(i);
}).Start();
}
Console.ReadKey();
}
//改示例输出的内容是不确定的,这里的问题是变量i在for循环执行时指向同一个内存地址。输出的过程中,i的值是在变化的。
//可以通过一个临时变量解决改进:
static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
int temp = i;
new Thread(() => {
lib.put(temp);
}).Start();
}
Console.ReadKey();
}
//变量temp在每个循环迭代中位于不同的内存块。因此每一个线程捕获到了不同的内存位置,而且没有问题。
//不过,这样输出输出的顺序也并非一定是0~9,以为不同线程的输出时间是不确定的。

命名线程

  • 线程的Name属性,用于获取或设置线程的名称。包含线程名称的字符串,或者如果未设置名称,则为 null。Name属性设置后将无法修改,尝试修改会跑出System.InvalidOperationException
static void Main(string[] args)
{
Thread td = new Thread(threadOne);
td.Name = "Thread:td";
//td.Name = "Thread:td0";打开将报错,name。
td.Start();
Thread td1 = new Thread(threadOne);
td1.Name = "Thread:td1";
td1.Start();
Console.ReadKey();
}
static void threadOne( )
{
if (Thread.CurrentThread.Name == "Thread:td")
{
lib.print("[[ current thread is \"Thread:td\" ]]");
}
else
{
lib.print(Thread.CurrentThread.Name);
}
}

前台线程和后台线程

  • 默认情况下,显示创建的线程是前台线程。对于前台线程,只要其中任意一个正在运行,这个应用程序就一直存活。而后台线程不是这样的,一旦所有的前台线程完成,这个应用程序就结束了, 任何正在运行的后台线程立刻终止。
  • 线程的IsBackground属性用于获取或设置一个值,该值指示某个线程是否为后台线程。如果此线程是后台线程或即将成为后台线程,则为 true;否则为 false。如果线程已经结束,访问IsBackground属性将跑出System.Threading.ThreadStateException异常。
  • 当一个进程以这种方式终止,则任何后台线程执行栈里面的finally 语句块将会被规避。如果你的线程使用finally(or using)语句块去执行如释放资源或者删除临时文件的清理工作,这将是一个问题。为了避免这个,你可以显示地等待后台线程完成再退出应用程序。
  • 一个线程前台/后台的状态跟它的优先级和配置的执行时间没有关联。
static void Main(string[] args)
{
Thread td = new Thread(() =>
{
for (int i = ; i < ; i++)
{
Thread.Sleep();
lib.put(i + " ");
}
});
td.IsBackground = true;
td.Start();
//td.Join();打开此处将等到后台线程td跑完再结束程序,否则将直接结束。
}

线程优先级

  • 一个线程的优先级决定了在操作系统中它可以得到多少相对其他线程的执行时间,下面是线程优先级的等级:
public enum ThreadPriority
{
Lowest = ,
BelowNormal = ,
Normal = ,
AboveNormal = ,
Highest = ,
}

当多线程同时是激活的,线程优先级是很重要的。

注意:提高线程优先级时,需要非常小心,这将可能导致其他线程对资源访问的饥饿状态的问题。

当提升一个线程的优先级时,不会使它执行实时工作,因为它被应用程序的进程优先级限制了。为了执行实时工作,你也必须通过使用System.Diagnostics的Process类来提升进程的优先级:

using (Process p = Process.GetCurrentProcess())
{
p.PriorityClass = ProcessPriorityClass.High;
}

C# 多线程系列(三)


												

C# 多线程系列(二)的更多相关文章

  1. java多线程系列(二)

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  2. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  3. c# 多线程系列二 自定义线程执行器

    看了第一篇文章,多线程系列,看到了在线程执行任务队列有了一定的了解~! 那么今天我来讲讲,怎么样构建通用的自定义线程概念! 线程执行任务,肯定要有目标,但是如果写死了,那么一个线程处理执行职能按照思路 ...

  4. (Java多线程系列二)线程间同步

    Java多线程间同步 1.什么是线程安全 通过一个案例了解线程安全 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果. 先来看一个线程不安全的例子 class Sell ...

  5. Java多线程系列二——Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...

  6. 【Java多线程系列二】Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法. /* * 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会 */ public s ...

  7. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  8. MySQL并发复制系列二:多线程复制

     http://blog.itpub.net/28218939/viewspace-1975822/ 并发复制(Parallel Replication) 系列二: Enhanced Multi-th ...

  9. MySQL并发复制系列二:多线程复制 2016

    并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/M ...

  10. 多线程系列之 java多线程的个人理解(二)

    前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...

随机推荐

  1. js 图表转图片

    最近项目上有个需求,是将一些teechart做的图表转换成图片插入自动生成的PDF里,Teechart绘图和如何生成PDF这些这里就不说了,这个任务比较别扭的一点是,图表自动生成,且整个过程中页面不能 ...

  2. Codeforces 918D/917B - MADMAX

    传送门:http://codeforces.com/contest/918/problem/D 本题是一个组合游戏问题——DAG上的动态规划问题. 有一张有向无环图(DAG).有两个玩家在这张图上进行 ...

  3. hadoop手工移块

    1.关于磁盘使用策略,介绍参考http://www.it165.net/admin/html/201410/3860.html 在hadoop2.0中,datanode数据副本存放磁盘选择策略有两种方 ...

  4. Spring Cloud 之 Cookie 丢失 与 Host 传递

    通过spring zuul 代理至后台,写入Cookie发现无法写入,到浏览器中,和无法获取Domain域名 通过长时间的度娘和求助别人发现:Spring-zuul  需要加入以下配置 zuul.se ...

  5. python编码小记

    Python编码小记 标签(空格分隔): 编程 python 1.list类型remove()操作 列表对象执行remove()函数后,会自动退出循环,所以如果想利用一个单独的for循环删除列表中多个 ...

  6. HDU 4542

    T_T终于让我过了,坑啊,竟然时限是200ms... 我是预处理出不整除了个数的,因为这个较容易一点.利用算术基本定理,f=p1^a1*p2^a2...... 所以,整除它的个数就是(a1+1)*(a ...

  7. 申请Letencrypt的免费证书文件-nginx

    1.前言 Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla.思科.Akamai.IdenTrust和EFF等组织发起,目的就是向网站 ...

  8. NSRange and NSString对象

    http://www.cnblogs.com/pengyingh/articles/2451292.html 当谈到NSString方法时,你会发现很多都涉及到NSRange.不必操心.它事实上仅仅只 ...

  9. MFC的UI更新机制和加速键的创建

    近期在看<MFC Windows程序设计>这本书,正好看到更新菜单中的菜单项和加入菜单项的加速键这方面的内容,下面总一下总结. MFC提供的更新菜单项的机制例如以下: 通过消息映射表中的O ...

  10. Android 实现文字与图片的混排

    在我们的项目中,常常会碰到图片与文字混排的问题.解决这类问题的方法有非常多,本文给出的方法不是唯一的.仅仅有依据实际场景才干找到更适合的方法. 本文主要通过xml布局来实现图片与文字的混排(水平排列) ...