第一天 尝试Thread

一:Thread的使用

我们知道这个类代表处理器线程,在Thread中有几个比较常用和重要的方法。

<1> sleep:  这个算是最简单的了。

<2> join:    这个可以让并发行处理变成串行化,什么意思呢?上代码说话最清楚。

 1 class Test
 2 {
 3     static void Main()
 4     {
 5         Thread t = new Thread(Run);
 6
 7         t.Start();
 8
 9         //Join相当于把Run方法内嵌如此
10         t.Join();
11
12         //该死的t.Join(),害的我主线程必须在你执行完后才能执行。
13         Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
14     }
15
16     static void Run()
17     {
18         //等待5s
19         Thread.Sleep(5000);
20
21         Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
22     }
23 }

<3> Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区别的。

① Interrupt:  抛出的是 ThreadInterruptedException 异常。

Abort:  抛出的是  ThreadAbortException 异常。

② Interrupt:如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个

contine操作。

Abort:这个就是相当于一个break操作,工作线程彻底死掉。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
 6             Thread t = new Thread(new ThreadStart(Run));
 7             t.Start();
 8             t.Interrupt();
 9             Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
10             Console.ReadLine();
11         }
12         static void Run()
13         {
14             Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
15             for (int i = 1; i <= 3; i++)
16             {
17                 Stopwatch watch = new Stopwatch();
18                 try
19                 {
20                     watch.Start();
21                     Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
22                     Thread.Sleep(2000);
23                     watch.Stop();
24                     Console.WriteLine("第{0}延迟执行:{1}ms", i, watch.ElapsedMilliseconds);
25                 }
26                 catch (ThreadInterruptedException e)
27                 {
28                     Console.WriteLine("第{0}延迟执行:{1}ms,抛出异常", i, watch.ElapsedMilliseconds);
29                 }
30             }
31         }
32     }
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
 6             Thread t = new Thread(new ThreadStart(Run));
 7             t.Start();
 8             t.Abort();
 9             Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
10             Console.ReadLine();
11
12         }
13         static void Run()
14         {
15             Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
16             for (int i = 1; i <= 3; i++)
17             {
18                 Stopwatch watch = new Stopwatch();
19                 try
20                 {
21                     watch.Start();
22                     Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
23                     Thread.Sleep(2000);
24                     watch.Stop();
25                     Console.WriteLine("第{0}延迟执行:{1}ms", i, watch.ElapsedMilliseconds);
26                 }
27                 catch (ThreadInterruptedException e)
28                 {
29                     Console.WriteLine("第{0}延迟执行:{1}ms,抛出异常", i, watch.ElapsedMilliseconds);
30                 }
31             }
32         }
33     }
时间: 2024-11-10 08:14:38

第一天 尝试Thread的相关文章

【转载】5天不再惧怕多线程——第一天 尝试Thread

原本准备在mongodb之后写一个lucene.net系列,不过这几天用到多线程时才发现自己对多线程的了解少之又少,仅仅停留在lock上面, 故这几天看了下线程参考手册结合自己的心得整理一下放在博客上作为自己的学习笔记. 好了,我们知道"负载"是一个很时尚,很牛X的玩意,往大处说,网站需要负载,数据库需要负载.往小处说,线程也需要负载,面对海量的 用户请求,我们的单线程肯定扛不住,那么怎么办,一定要负载,所以说多线程是我们码农必须要熟练掌握的一门技术. 在framework中给我们提供

如何创建线程第一种继承Thread类

步骤 1:定义一个类 继承Thread类.2:重写Thread类的run方法.3:直接创建Thread的子类对象创建线程.4:调用start方法开启线程并调用线程的任务run方法执行.----------------------------------------------- package TestException; public class test1 { public static void main(String[] args) { // 3:直接创建Thread的子类对象创建线程.

[读书笔记]多线程基础

转自:http://www.cnblogs.com/huangxincheng/category/362940.html 第一天 尝试Thread 一:Thread的使用 我们知道这个类代表处理器线程,在Thread中有几个比较常用和重要的方法. <1> sleep:  这个算是最简单的了. <2> join:    这个可以让并发行处理变成串行化,什么意思呢?上代码说话最清楚. <3> Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机运行的应用程序任务(task). 仅仅有一个线程的样例: public class Factorial { public static void main(String[] args) { int n = 5; System.o

缓解MySQL写入压力和主从延迟的尝试

缓解MySQL写入压力和主从延迟的尝试 http://mp.weixin.qq.com/s?__biz=MzA5Njg5ODMzMg==&mid=208512935&idx=1&sn=a605bb3b2f944f7fdce820b940e0888b&scene=2&from=timeline&isappinstalled=0#rd 最近单位需要用MySQL存放大量的日志数据.写入压力很大,并且有很大的主从延迟. 具体环境如下MySQL 5.6.14服务器(单

leetcode第一刷_N-Queens

八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象,最后的附录有这个问题的源代码,当时根本不懂编程,照抄下来,运行一下出了结果都很开心,哎. 皇后们的限制条件是不能同行同列,也不能同对角线.那么显然每一列上都要有一个皇后,只需要用一个一维数组记录皇后在每一行上的位置就可以了.算法的思想是:从第一行开始,尝试把皇后放到某一列上,可以用一个vis数组保存已经有皇后的列,当找到一个还没有皇后的列时,就尝试着把当前皇后放上,然后看看有没有之前放好的皇后跟这个皇后同对角线,如果同对角线的话

C#多线程Thread.Join()的详解

class TestThread { private static void FirstThreadFun() { for (int i = 0; i < 10; i++) { Console.WriteLine(Thread.CurrentThread.Name + " i = " + i); } Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕"); } static void Main(string

Thread线程简单使用

这是自己以前学习线程时所做的一些总结 一:创建一个线程 继承Thread  类 线程类(Thread)包含一个可以运行的过程(方法):run()方法 2)  创建一个具体线程的步骤如下: 第一,继承 Thread 类 第二,重写 run 方法(就是更新运行过程),  实现用户自己的过程 第三,创建线程实例(就是创建一个线程) 第四,使用线程实例的 start()  方法启动线程,  启动0以后线程会尽快的去并发执行 run() 线程的 5 中状态 1)  New      新建状态 当程序使用