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#多线程学习(一) 多线程的相关概念 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序 ...
随机推荐
- GoogleMap-------manifest文件配置
前言:在使用GoopleMap之前需要配置manifest文件 1.这个可有可无,com.xhm.meishi是项目的包名 <!-- 声明调用这个应用需要的权限 --> <permi ...
- NGINX快速部署
NGINX快速部署 #!/bin/bash ############################################################################## ...
- 读取文件之<绝对路径>与<相对路径>
前言:字符流.字节流读取文件,下面的代码是在网上找到的一个各种文件读取方式,还算比较详细,分享给大家. public class ReadFromFile { /** * 以字节为单位读取文件,常用于 ...
- ScheduleFactory(不同scheduler name)
package com.unis.uvm.quartz; import java.util.Properties; import org.quartz.Scheduler; import org.qu ...
- jmeter操作myql数据库
1.先安装mysql的驱动mysql-connector-java-5.1.7-bin.jar 配置jdbc的connection configuration Database Url :jdbc:m ...
- 关于new HashMap<>(1)中1的理解(hashMap的加载因子)
新入公司,阅读代码的时候发现了一行代码,为 Map<String, String> map=new HashMap<>(1); 对于这个括号里面的1不能理解,于是查了资料,大概 ...
- std::condition_variable(复习)
#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> ...
- 【BZOJ3687】简单题 背包+bitset
[BZOJ3687]简单题 Description 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和.3.子集的算术和的算术和.4.子集的算术和的 ...
- 《从零开始学Swift》学习笔记(Day 36)——静态方法
原创文章,欢迎转载.转载请注明:关东升的博客 静态方法与静态属性类似,Swift中定义了静态方法,也称为类型方法.静态方法的定义与静态属性类似,枚举和结构体的静态方法使用的关键字是static:类静态 ...
- ECMAScript/JS 基础知识讲解
闭包 下面这个方法能输入0 1 2 ... 9吗?显然是不可以的,输出结果是10个10. function test() { var arr = []; for(var i = 0; i < 1 ...