Thread类
Thread类相对于线程池中的线程,使用者有更多的控制权。该类允许创建前台线程,设置线程优先级等。Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。
1、给线程传递数据
给线程传递数据的两种方式:
1.使用带ParameterizedThreadStart委托参数的Thread构造函数:
//定义一个数据类型,传递给线程
public struct Data
{
public string Message;
}
//创建一个方法,将方法给线程的ParameterizedThreadStart委托
static void ThreadMainWithParameters(object obj)
{
Data d = (Data)obj;
Console.WriteLine("Running in a thread, received {0}", d.Message);
}
static void Main()
{
Data d = new Data { Message = "Info" };//创建一个数据实例
Thread t2 = new Thread(ThreadMainWithParameters);//创建线程
t2.Start(d);//启动线程,并传递参数
}
2.自定义一个类,把线程的方法定义为实例方法,然后初始化实例的数据后启动线程。
//定义一个类,用于存放线程需要的数据和线程启动的方法
public class MyThread
{
private string data;//线程数据 public MyThread(string data)
{
this.data = data;
}
//线程启动方法
public void ThreadMain()
{
Console.WriteLine("Running in a thread, data: {0}", data);
}
}
static void Main()
{
MyThread obj = new MyThread("info");//创建实例信息
Thread t3 = new Thread(obj.ThreadMain);//启动实例方法
t3.Start();
}
2、后台线程
如果应用程序内有任何一个前台线程在运行,那么应用程序就在运行。Thread类创建的线程默认时前台线程,线程池中创建的线程是后台线程。在使用Thread类创建线程时,可以设置IsBackground属性,以设置创建的Thread线程时后台线程还是前台线程。例如:
//创建线程方法,以在主线程中调用
static void ThreadMain()
{
Console.WriteLine("Thread {0} started", Thread.CurrentThread.Name);
Thread.Sleep();
Console.WriteLine("Thread {0} completed", Thread.CurrentThread.Name);
}
static void Main()
{
Thread t1 = new Thread(ThreadMain);
t1.Name = "MyNewThread";
t1.Start();
Thread.Sleep(100);
Console.WriteLine("Main thread ending now...");
/*******************输出********************
* Thread MyNewThread started
* Main thread ending now...
* Thread MyNewThread completed
* *****************************************/
}
可以看到,主线程先完成任务。但是主线程内启动的新线程是前台线程(默认),导致主线程结束任务后,新线程仍在写入控制台输出。如果在线程启动前,将线程的IsBackground属性设置为true,主线程结束时,会终止新线程的执行(不论是否完成任务)。
static void Main()
{
Thread t1 = new Thread(ThreadMain);
t1.Name = "MyNewThread";
t1.IsBackground = true;
t1.Start();
Thread.Sleep();
Console.WriteLine("Main thread ending now...");
/*******************输出********************
* Thread MyNewThread started
* Main thread ending now...
* *****************************************/
}
后台线程适合用于完成后台任务。
3、线程的优先级
线程由操作系统调度。给线程指定优先级,将影响线程调度顺序。优先级越高的线程,将会得到系统优先调度在CPU上运行。如果线程在等待资源,它就会停止运行,并释放CPU。
线程必须等待的可能原因:响应睡眠指令、等待磁盘I/O完成、等待网络包到达等。如果线程不主动释放CPU,线程调度器就会抢占该线程。线程由一个时间量,它可以持续使用CPU,直到时间到达(如果没有更高优先级的线程时)。如果优先级相同的多个线程等待CPU,线程调度器会使用一个循环调度原则,将CPU逐一交个线程使用。如果线程被其他线程抢占,那么它会排队到最后去。
只有优先级相同的多个线程同时在运行时,才能用上时间量和循环规则。优先级是动态的:如果线程是CPU密集型,一直需要CPU,而且不等待资源,其优先级就降低为用该线程定义的基本优先级;如果线程在等待资源,它的优先级会提高。由于优先级的提高,所以线程可能在下一等待结束时获得CPU。
线程的Priority属性,可以设置线程的优先级。线程指定优先级时,可能降低其他线程的运行概率。所以,可以根据需要短暂改变优先级。
4、控制线程
调用Thread对象的Start()方法可以创建线程。但是,新线程并不是出于Running状态,而是Unstarted状态。当线程调度器调用线程时,线程则会改为Running状态。其ThreadState属性可以获得线程的状态。
线程类的静态方法Sleep(),会使线程处于WaitSleepJoin状态,在等待一段时间后,线程将再次被唤醒。
如果要停止一个线程,可以调用方法Abort()。调用该方法,会在接到终止命令的线程中抛出ThreadAbortException类型异常。捕获该异常,可以在线程结束前做一些清理工作。如果再调用方法ResetAbort(),可能有机会再收到异常后继续运行。如果线程没有重置,接收到终止请求的线程的状态就从AbortRequested改为Aborted。
调用Join()方法可以等待线程的结束。该方法会停止当前线程,并把它设置为WaitSleepJoin状态,直到加入的线程完成。
Thread类的更多相关文章
- Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
- 继承Thread类
Thread类在包java.lang中,从这个类中实例化的对象代表线程,启动一个新线程需要建立Thread实例,Thread类中常用的两个构造方法如下: (1)public Thread(String ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- 创建Thread类的子类
package unit8; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = ne ...
- Java通过继承thread类与实现Runnable接口实现多线程的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 一.通过继承T ...
- java中多线程中Runnable接口和Thread类介绍
java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- C#线程系列讲座(2):Thread类的应用
一.Thread类的基本用法 通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法.可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返 ...
- Java基础之线程——派生自Thread类的子类(TryThread)
控制台程序. 程序总是至少有一个线程,程序开始执行时就会创建这个线程.在普通的Java应用程序中,这个线程从mian()方法的开头启动. 要开始执行线程,可以调用Thread对象的start()方法. ...
随机推荐
- C++Builder STL 泛型
STL(Standard Template Library)标准模板库, 包括了算法,容器,迭代器.就是泛型. 向量(vector) 连续存储的元素<vector>列表(list) 由节点 ...
- PO BO VO DTO POJO DAO概念及其作用
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...
- 几组不错的X264自定义编码<转>
转帖地址:http://tieba.baidu.com/p/4201033507 一般直播时使用A设定即可.你尝试设置并找出你最满意的设定 A为最需最低CPU资源,E为最高. A8x8dct=1 aq ...
- STL string 常用函数(转)
string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...
- Struts2 学习记录-1--Struts2中的配置文件
目录 1. web.xml 2. struts.xml 3. struts.properties文件 4.注解式开发 5.与Spring框架集成的配置 主要涉及3个配置文件:web.xml.strut ...
- 【独家】阿里天池IJCAI17大赛第四名方案全解析(附代码)
[独家]阿里天池IJCAI17大赛第四名方案全解析(附代码) https://mp.weixin.qq.com/s?__biz=MzAxMzA2MDYxMw==&mid=2651560625& ...
- mongoTemplate.aggregate()聚合查询
一.概述 1. 聚合的表达式 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 下表展示了一些聚 ...
- docker国内registry
cat /etc/docker/daemon.json {"registry-mirrors": ["http://4d6b2eb7.m.daocloud.io" ...
- linux 查看文件夹文件大小数目等信息
1. 查看当前目录所有文件和文件夹的大小 方法一: $du -sh * 或 $du -h -d 0 * '-d 0' 代表查询目录的深度为0 ,也就是当前目录,'-d 3' 表示文件目录深度为3,可以 ...
- WebService之SOAP
SOAP(Simple Object Access Protocol),它是一种标准消息传递协议,通常是Web Service的事实标准.SOAP是以XML为基础,SOAP消息格式是由XML Sche ...