线程 实用的基础篇(1)

主要讲述三点:

一,任务,线程,进程,线程的概念和关系

二,线程主要属性和方法

三,线程的创建,参数的传递和返回值的接收

一、任务,程序,进程,线程

任务是什么?

任务:交派的工作,这里是指软件为达到某个目的的一系列操作。一个任务可以是一个进程,也可以是一个线程,还可以是一个简单的程序。

多任务:指操作系统一次运行多个应用程序的能力。比如现在的电脑可以同时开多个窗口就是多任务的表现。

不再详细解释。

程序是什么?

程序:一组指令的有序集合,简而言之就是指令集。

不再详细解释。

进程是什么?

进程是程序执行环境的总和。

解释一下,这个执行环境我们可以把它看做一个操作系统为程序分配的运行物理隔离区。在这个隔离区为其分配标志ID,内存,CPU等程序运行所需的各项资源。进行物理隔离的好处是防止其他进程修改另一个进程的数据。使进程之间互不影响。

举个栗子,我要做一个蛋糕,我有做一个做生日蛋糕的食谱,厨房里有所需的原料(面粉鸡蛋神马的),这个时候我就是处理器,食谱就是程序,原料就是输入,放原料的厨房就是内存。进程么就是我阅读食谱根据拿来的原料在厨房进行烘烤蛋糕这一系列流程的总和。

线程是什么?

线程是某一个进程单独运行的指令集。

解释一下,我们知道我们写的程序代码以Main()函数为入口自上而下执行。而线程是一种特殊的对象,它是操作系统执行多任务的一部分,它允许应用程序一部分对立其他对象而单独运行,因此也就脱离了应用程序常规的执行顺序。

举个栗子看下面一段代码

 public  class Class1
    {
      public void TestMain()
      {
          task();//先执行
          DoData();//后执行
      }
      public void ThreadMain()
      {
          Thread thread = new Thread( new ThreadStart(task));
          thread.Start();
          DoData();
      }
      public void task() { }   //里面逻辑省略
      public void DoData() { }//里面逻辑省略

    }

正常情况下就是TestMain()这个方法先执行task,后执行DoData而且是必须等task方法执行完才能执行DoData方法。

而ThreadMain用了线程以后调用task方法,那么它就可以单独运行,DoData不需要等待task执行完毕就可以执行。

线程和进程的关系

可以用下图表示

二、了解线程

线程的构建函数,属性和方法,可以参考MSDN:https://msdn.microsoft.com/zh-cn/library/system.threading.thread(v=vs.110).aspx

这里学习一下主要一些东西。

创建线程的构造函数:

  名称 说明
Thread(ParameterizedThreadStart)

初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。

Thread(ParameterizedThreadStart, Int32)

初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小。。

Thread(ThreadStart)

初始化 Thread 类的新实例。

Thread(ThreadStart, Int32)

初始化 Thread 类的新实例,指定线程的最大堆栈大小。

线程的常用属性:

  名称 说明
IsAlive

获取指示当前线程的执行状态的值。

Priority

获取或设置指示线程的调度优先级的值。

ThreadState

获取一个值,该值包含当前线程的状态。

线程常用方法:

其实就是线程的启动,终止,中断,等待,挂起

名称 说明
Abort()

在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。

Interrupt()

中断处于 WaitSleepJoin 线程状态的线程。

Join()

阻止调用线程,直到此实例所表示的线程终止,同时继续执行标准的 COM 和 SendMessage 泵处理期间。

Join(Int32)

阻止调用线程,直到此实例所表示的线程终止或经过指定的时间,同时继续执行标准的 COM 和 sendmessage 消息泵处理。

Join(TimeSpan)

阻止调用线程,直到此实例所表示的线程终止或经过指定的时间,同时继续执行标准的 COM 和 sendmessage 消息泵处理。

ResetAbort()

取消当前线程所请求的 Abort

Sleep(Int32)

将当前线程挂起指定的毫秒数。

Sleep(TimeSpan)

将当前线程挂起指定的时间。

Start()

导致操作系统将当前实例的状态更改为 ThreadState.Running

三、创建线程(创建线程的几种方法总结)

(1)无传递参数,无返回参数

ThreadStart threadStart=new ThreadStart(Task);
Thread thread=new Thread(threadStart);
thread.Start(); 

public void Task(){
//
} 简化版可以直接写成:
Thread thread=new Thread(new ThreadStart(Task)); 

thread.Start();

 public void Task(){ // } 

(2)传递单个参数(利用ParameteriizedThreadStart来构建)

ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)
Thread thread=new Thread()
thread.Start(0.9); 

public void Task(object arg){
double Diameter=double(arg);

}

(3)传递多个参数

第一种:使用专门的线程类。

把线程调用的方法和所需的参数放到一个类中。调用的方法是类的方法,参数是类的属性。建立一个带参数的构造函数,这样就可以把参数作为构建函数的参数传入类的属性里。

public  class Class1
    {

      public void ThreadMain()
      {
          MyThread t=new MyThread(3,4);
          ThreadStart threadStart = new ThreadStart(t.Task);
          Thread thread=new Thread(threadStart);
          thread.Start();
      }

    }
  public class MyThread
  {
      public double Diameter = 10;

      public double Result = 0;
      public int Width { get; set; }
      public int Height { get; set; }

      public MyThread(int width,int height)
      {
          Width = width;
          Height = height;
      }

      public void Task()
      {
          int Area = Width * Height;
      }
  }

第二种方法:通过使用委托委托

  public  class Class1
  {
      public void ThreadMain()
      {
          Thread thread = new Thread(new ThreadStart(delegate() { Task(3, 4); }));
          thread.Start();
      }
       public void Task(int Width,int Height)
       {
          int Area = Width * Height;
       }
    }   

(4)需要传递参数且需要返回参数

首先把需要异步调用的方法定义为一个委托,然后利用BeginInvoke来异步调用,最后用EndInvoke来接收返回值

namespace Sx.WF
{
   delegate int DeleTask(int Width,int Height);
  public  class Class1
  {
      static DeleTask task;
      public static int Area = 0;
      public void ThreadMain(int Width, int Height)
      {
          task = new DeleTask(Task);
          task.BeginInvoke(Width, Height,new AsyncCallback(TaskFinished), null);
          Thread thread = new Thread(new ThreadStart(delegate() { task(Width, Height); }));
          thread.Start();
      }
       public static int Task(int Width,int Height)
       {
          int Area = Width * Height;
          return Area;
       }
       public static void TaskFinished(IAsyncResult result)
       {
           Area = task.EndInvoke(result);
       }

    }
  }
时间: 2024-08-30 16:16:57

线程 实用的基础篇(1)的相关文章

Java(Android)线程池---基础篇

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 newThread(newRunnable(){ 2 3 @Override 4 publicvoidrun(){ 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致

位运算简介及实用技巧(一):基础篇[转]

位运算简介及实用技巧(一):基础篇 原贴链接:http://www.matrix67.com/blog/archives/264 去年年底写的关于位运算的日志是这个Blog里少数大受欢迎的文章之一,很多人都希望我能不断完善那篇文章.后来我看到了不少其它的资料,学习到了更多关于位运算的知识,有了重新整理位运算技巧的想法.从今天起我就开始写这一系列位运算讲解文章,与其说是原来那篇文章的follow-up,不如说是一个remake.当然首先我还是从最基础的东西说起. 什么是位运算?    程序中的所有

基础篇——网络与线程

一.客户端读/写 Socket s = new Socket("127.0.0.1",5000); InputStreamReader stream = new InputStreamReader(s.getInputStream()); BufferedReader reader = new BufferedReader(stream); String message = reader.readLine(); PrintWriter writer = new PrintWrite(s

Spark性能优化指南——基础篇

前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用范围与前景非常广泛.在美团•大众点评,已经有很多同学在各种项目中尝试使用Spark.大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快.性能更高. 然而,通过Spark开发出高性能的大数据计算作业,并不是那么简单的.如果没有对Spar

Boost智能指针-基础篇

简介 内存管理一直是 C++ 一个比较繁琐的问题,而智能指针却可以很好的解决这个问题,在初始化时就已经预定了删除,排解了后顾之忧.1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来访问一个动态分配的对象.std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象.当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址.既然std::auto_pt

面试准备&总结-Java基础篇

在vps的服务器到期了,在hw又不能访问,直接在博客园写笔记了.  基础篇 1. 集合类的继承关系,源码实现原理,初始大小和如何增长. - list类初始大小10,加载因子为1,扩容到1.5+1.底层是个Object数组,调用 System.arraycopy进行拷贝. - Vector同上,扩容倍数是两倍,是同步的,线程安全. - HashMap初始大小16,加载因子0.75f,扩容到2倍.底层是数组+链表,调用resize()调整位置. - HashTable初始大小11,加载因子0.75f

美团Spark性能优化指南——基础篇

http://tech.meituan.com/spark-tuning-basic.html 前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用范围与前景非常广泛.在美团?大众点评,已经有很多同学在各种项目中尝试使用Spark.大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快.性

问道python之基础篇【一】 认识python

问道python之基础篇[一] 认识python 1.python的简介 1.1.什么是python? Python是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python语法简洁清晰,特色之一是强制用空白符作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能够用其他语言制作的各种模块(尤其是C++)很轻松地联结在一起. 1.2.python的特点 简单,易学,免费.开源,高层语言,移植性,

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层