C#多线程学习之Thread
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ThreadTest
{
class Program
{
static void DoWork()
{
Console.WriteLine("DoWork is begin"); for (int i = ; i < ; i++)
{
try
{
if (i == )
{
//终止线程,会抛出一个ThreadAbortException 类型的异常
Thread.CurrentThread.Abort(i);
} Console.WriteLine(string.Format("{0} {1}", Thread.CurrentThread.Name, i));
Thread.Sleep();
}
catch (ThreadAbortException e)
{
Console.WriteLine(string.Format("{0} is Abort when i is {1}", Thread.CurrentThread.Name, e.ExceptionState)); //取消终止,静态方法
Thread.ResetAbort();
} } Console.WriteLine("DoWork is end");
} /// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.WriteLine("Main thread begin"); #region Thread类构造函数的参数是:不带参数的静态方法 Thread myThread1 = new Thread(Program.DoWork);
myThread1.Name = "thread1"; /*
* 有关前台线程和后台线程
* 线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程!
* 当一个进程除了主线程之外其他线程都是后台线程时,应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行。
* 使用Thread.Start()启动的线程默认为前台线程,而系统必须等待所有前台线程运行结束后,应用程序域才会自动卸载。
*/ //设置为后台线程
myThread1.IsBackground = true; myThread1.Start(); #endregion #region Thread类构造函数的参数是:带参数的非静态方法 string str = string.Format("test");
Test myTest = new Test(); //如果Thread的构造函数的参数是带参数的方法,则这个参数要求是object类型
Thread myThread2 = new Thread(myTest.ShowMessage);
myThread2.Name = "thread2"; //设置为前台线程,默认为前台线程
myThread2.IsBackground = false; myThread2.Start(str); /*
* thread线程间的同步:join方法
*
* 关于对 Thread类实例的Join方法的理解.
* 两个线程的关系如下:一个线程(旧的)生成并启动另一个线程(新的).
* join方法只能在以下条件被调用:一个新的线程被创建并且调用start方法后.
* join方法的作用:阻塞。在旧的线程代码里,运行到行新线程实例的join方法时,旧线程将会被阻塞,
* 直到新线程(不管是前台还是后台线程)执行完成后,旧线程才会继续执行join方法后面的代码。
*
* 比喻如下:线程A创建了线程B和线程C并且都调用start方法启动了线程B和C,线程A才能调用线程B和C的join方法,
* 表示线程A将阻塞等到线程B和C执行完之后再继续执行。但线程B和C之间是不用通过join方法来通信或者同步的。
*
* 在本例里,main线程是主线程,创建线程myThread1和myThread2并都启动了,在执行到myThread2.Join();代码时,
* 主线程main线程将被阻塞,直到myThread2线程执行完之后,再继续执行
*
*/ myThread2.Join(); #endregion //其他:Suspend 与 Resume 方法分别表示挂起和恢复线程,已过时,微软不建议继续使用,不做介绍。 Console.WriteLine("Main thread end");
Thread.Sleep();
// Console.ReadKey();
} } class Test
{
//要作为Thread的构造函数的参数,则这个参数要求是object类型
public void ShowMessage(object obj)
{
Console.WriteLine("ShowMessage is begin"); string str = obj as string;
for (int i = ; i < ; i++)
{
Console.WriteLine(string.Format("{0} {1}{2}", Thread.CurrentThread.Name,str, i));
Thread.Sleep();
} Console.WriteLine("ShowMessage is end");
}
}
}
C#多线程学习之Thread的更多相关文章
- java多线程学习
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...
- Java多线程学习(吐血超详细总结)
本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- [转]Java多线程学习(吐血超详细总结)
转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...
- Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )
目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...
- 多线程学习-基础(一)Thread和Runnable实现多线程
很久没记录一些技术学习过程了,这周周五的时候偶尔打开“博客园”,忽然让我产生一种重拾记录学习过程的想法,记录下学习研究过程的一点一滴,我相信,慢慢地就进步了!最近想学习一下多线程高并发,但是多线程在实 ...
- JUC学习笔记--Thread多线程基础
实现多线程的两种方法 java 实现多线程通过两种方式1.继承Thread类 ,2.实现Runnable接口 class Newthead extends Thread{ public void ru ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- 【转】C#多线程学习
C#多线程学习(一) 多线程的相关概念 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序 ...
随机推荐
- 003android初级篇之【转】Android开发中颜色的定义方法
正好用到颜色的定义,但脑子里没有记住具体,转载一篇加强印象 1.使用Color类的常量,如: int color = Color.BLUE; // 创建一个蓝色 是使用Android提供的颜色 int ...
- jQuery EasyUI编辑DataGrid用combobox实现多级联动
我在项目中设计课程表的时候需要用到老师和分类之间的多级联动. 首先是一张效果图: 下面是实现的代码: <body> <script type="text/javascrip ...
- 2213 Problem J
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...
- js事件绑定的方法
废话不多少,直接上代码 第一种 <body> <div style="width:400px;height:400px;background:blueviolet" ...
- 辛星教你高速掌握PHP的正則表達式
首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,因为人数众多.并且来源也是特别分散,就不一一介绍了,见谅. ************跨语言的主题* ...
- 《从零开始学Swift》学习笔记(Day 47)——final关键字
原创文章,欢迎转载.转载请注明:关东升的博客 在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: f ...
- SQL获取某个时间字符串里的月和日,获取某天是周几
select datename(weekday,'2016-11-4') as '周' select convert(varchar,datepart(month,'2016-11-4')) as ' ...
- 安装mysql报错—解决方法:error while loading shared libraries: libssl.so.6
for 32bit ln -sf /usr/lib/libssl.so.10 /usr/lib/libssl.so.6ln -sf /usr/lib/libcrypto.so.10 /usr/lib/ ...
- Redis持久化之rdb&aof
Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...
- /cloudmonitor.log 主机监控
989866842 INFO 2018-09-30 01:38:58.58 [ricGatherServiceHttp] 提交指标完成,耗时:18ms. SystemInfo [serialNumbe ...