线程基础(一)

2015年自己定了个目标就是开始写写博客,所以心血来潮,我也来写写一些基础的东西。

线程,网上大把多资料,自己写也不会有什么新意。不过在自己做过的一些项目中用到很多线程相关的知识,但没有真正的去总结,去归纳的,导致到了用的时候有baidu、google(google被我朝禁了...我觉得是一种悲哀)。好了,下面开始我的线程基础了

1、线程的定义

线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。它是系统调度的最基本单位。个人的理解是线程相当于开辟一个单元去执行特定的方法过程,就涉及到方法中堆栈的分配,也就是线程堆栈的分配;执行时寄存器的调度使用;它最终由系统控制,按时间片去管理,需要tcb去管理切换等。(仅个人愚见,日后想通了,就另说)。线程有五个主要的基本状态:a、建立,b、就绪,c、运行,d、阻塞,e、消亡

2、.net framework 中的线程的属性

.net framework中提供了System.Threading的命名空间,用于操作线程。

下面是截取MSDN上的关于Thread的属性片段(不完整),如有需要可以去MSDN上看

标注的属性是我接触比较多的。

IsBackground属性标识线程为前台线程还是后台线程。当为true时表示该线程为后台线程,当主线程退出时,线程终止;当为false时为前台线程,要退出主线程,须等待所有前台线程结束有,主线程才完全退出。所以在设计时应该根据实际情况设定线程的IsBackground,默认是false。

IsThreadPool:是否是线程池管理的。不要和IsBackground混为一谈呀(以前想当然了)。

Priority:是线程的优先级别设定,.Net Framework的定义为枚举

 1  // 摘要:
 2     //     指定 System.Threading.Thread 的调度优先级。
 3     [Serializable]
 4     [ComVisible(true)]
 5     public enum ThreadPriority
 6     {
 7         // 摘要:
 8         //     可以将 System.Threading.Thread 安排在具有任何其他优先级的线程之后。
 9         Lowest = 0,
10         //
11         // 摘要:
12         //     可以将 System.Threading.Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。
13         BelowNormal = 1,
14         //
15         // 摘要:
16         //     可以将 System.Threading.Thread 安排在具有 AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前。默认情况下,线程具有
17         //     Normal 优先级。
18         Normal = 2,
19         //
20         // 摘要:
21         //     可以将 System.Threading.Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。
22         AboveNormal = 3,
23         //
24         // 摘要:
25         //     可以将 System.Threading.Thread 安排在具有任何其他优先级的线程之前。
26         Highest = 4,
27     }

关于线程优先级别,并不是说优先级越高,就先执行哪一个!而是优先级越高表示CPU分配给该线程的时间片越多,优先级别越低cpu为其分配的时间片就越短。

ThreadState:当前线程的状态。貌似也很少用。

3、.Net Framework的线程的方法

当然这个在MSDN上也是有的,这里就不截它了(很多方法,不明觉厉)。

主要说说几个方法吧:

1、Start()---开启线程

2、Sleep(int )----睡,挂起线程,以毫秒记。

3、Join()----阻塞调用线程,直到某个线程终止或经过了指定时间为止。就是抢占cpu优先执行某线程。

4、Interrupt----中断处于 WaitSleepJoin 线程状态的线程。该方法只是中断,会抛出ThreadInterruptedException的异常

5、Abort----终止某线程,在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。

6、SetData和GetNamedDataSlot关于数据槽的,本人表示不明觉厉,很少用到。

举个例子看看先:

 1 /// <summary>
 2         /// 程序入口
 3         /// </summary>
 4         /// <param name="args"></param>
 5         private static void Main(string[] args)
 6         {
 7             Thread thread = new Thread(new ThreadStart(ShowTime));
 8             thread.IsBackground = true;
 9             thread.Start();
10             Console.WriteLine(thread.IsThreadPoolThread);
11             Thread.Sleep(10);
12             thread.Interrupt();
13             //thread.Abort();
14             // thread.Priority = ThreadPriority.Highest;
15             //thread.Resume();
16             //thread.Join();
17             Console.WriteLine("End main:" + DateTime.Now.ToString());
18             Console.Read();
19         }
20         /// <summary>
21         /// 显示
22         /// </summary>
23         public static void ShowTime()
24         {
25
26             for (int i = 1; i < 4; i++)
27             {
28                 try
29                 {
30                     Stopwatch stopwatch = new Stopwatch();
31                     stopwatch.Start();
32                     Thread.Sleep(3 * 1000);
33
34
35                     stopwatch.Stop();
36                     Console.WriteLine("The {0} time take {1} milliseconds", i, stopwatch.ElapsedMilliseconds);
37                 }
38                 catch (ThreadInterruptedException interruptedEx)
39                 {
40                     Console.WriteLine("The {0} time throw interrupt exception: {1}", i, interruptedEx.Message);
41                 }
42                 catch (ThreadAbortException abortEx)
43                 {
44                     Console.WriteLine("The {0} time throw abort exception: {1}", i, abortEx.Message);
45                 }
46                 catch (Exception ex)
47                 {
48                     Console.WriteLine("The {0} time throw other  exception: {1}", i, ex.Message);
49                 }
50             }
51         }

运行结果,至于切换(注释部分的结果就不贴了)

4、.Net Framework的线程创建

其实就是有参与无参的构造方式

1         Thread nonThread = new Thread(() =>
2             {
3                 Console.WriteLine("无参数创建");
4             });
5             nonThread.Start();
6             Thread paramThread = new Thread(new ParameterizedThreadStart((o) => { Console.WriteLine(o); }));
7             paramThread.Start("有参");

OK!今天就写这么多吧!

时间: 2024-10-13 23:29:02

线程基础(一)的相关文章

线程基础知识

什么是线程: 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 进程与线程 进程是资源竞争的基本单位 线程是程序执行的最小单位 线程共享进程数据,但也拥有自己的一部分数据 线程ID 一组寄存器 栈 errno 信号状态 优先级 fork和创建新线程的区别 当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID.这个新进程的运行时间是独立的,它在执行时几乎

线程基础:多任务处理(13)——Fork/Join框架(解决排序问题)

============== 接上文< 线程基础:多任务处理(12)--Fork/Join框架(基本使用)> 3. 使用Fork/Join解决实际问题 之前文章讲解Fork/Join框架的基本使用时,所举的的例子是使用Fork/Join框架完成1-1000的整数累加.这个示例如果只是演示Fork/Join框架的使用,那还行,但这种例子和实际工作中所面对的问题还有一定差距.本篇文章我们使用Fork/Join框架解决一个实际问题,就是高效排序的问题. 3-1. 使用归并算法解决排序问题 排序问题是

线程基础:线程池(6)——基本使用(中)

(接上文:<线程基础:线程池(5)--基本使用(上)>) 3-4.JAVA主要线程池的继承结构 我们先来总结一下上文中讨论过的内容,首先就是JAVA中ThreadPoolExecutor类的继承结构.如下图所示: ThreadPoolExecutor:这个线程池就是我们这两篇文章中介绍的重点线程池实现.程序员可以通过这个线程池中的submit()方法或者execute()方法,执行所有实现了Runnable接口或者Callable接口的任务:ThreadPoolExecutor对于这些任务的执

线程基础--线程控制

3.  线程控制 1). 线程属性 目标:可以设置 线程的 detached/join 状态,线程栈的大小和最低地址等属性. detached/join 状态的区别: 当线程处于 分离状态(detached)时,线程结束时,os立即回收资源.主线程不可以调用pthread_join获取线程退出时的返回值. 当线程处于 未分离状态(join)时,线程结束时,主线程 调用pthread_join获取线程退出时的返回值, 随后释放该线程资源. a)数据类型 pthread_attr_t b)初始化及释

操作系统核心原理-4.线程原理(上)线程基础与线程同步

我们都知道,进程是运转中的程序,是为了在CPU上实现多道编程而发明的一个概念.但是进程在一个时间只能干一件事情,如果想要同时干两件或者多件事情,例如同时看两场电影,我们自然会想到传说中的分身术,就像孙悟空那样可以变出多个真身.虽然我们在现实中无法分身,但进程却可以办到,办法就是线程.线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”. 一.线程基础 1.1 线程概念 线程是进程的“分身”,是进程里的一个执行上下文或执行序列.of course,一个进程可以同时拥有多个执行序列.这就像

C#之线程基础概述

1.概述: 每个正在操作系统上运行的应用程序都是一个进程,一个进程可以包括一个或多个进程.线程是操作系统分配处理器时间的基本单元. 在进程中可以有多个线程同时执行代码,每个线程都维护异常处理程序.调度优先级和一组系统用于在调度该线程前保存线程上下文的结构. 线程上下文包括为使线程在线程的宿主进程地址空间中无缝地执行所需的所有信息,包括线程的CPU寄存器组和堆栈. 线程是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线

Android多线程研究(1)——线程基础及源代码剖析

从今天起我们来看一下Android中的多线程的知识,Android入门easy,可是要完毕一个完好的产品却不easy,让我们从线程開始一步步深入Android内部. 一.线程基础回想 package com.maso.test; public class TraditionalThread { public static void main(String[] args) { /* * 线程的第一种创建方式 */ Thread thread1 = new Thread(){ @Override p

Qt 线程基础(QThread、QtConcurrent等) 2

使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

线程基础知识系列(三)线程的同步

本文是系列的第三篇,前面2篇,主要是针对单个线程如何管理,启动等,没有过多涉及多个线程是如何协同工作的. 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 本文的主要内容 何谓线程安全? 何谓共享可变变量? 认识synchronized关键字 认识Lock synchronized vs Lock 1.何谓线程安全 多线程是把双刃剑,带