1.1线程基础(一)

作者: Vermandois | 来源:发表于2017-07-03 14:07 被阅读42次

好记性不如烂笔头,方便以后忘记了来这里看看,还有什么没有提到的大家可以告诉我,帮忙完善,谢谢!~ Donate?[1]


准备工作

创建一个控制台程序

并在Program.cs文件中加入以下using指令:

using System;
using System.Threading;
using System.Console;

1.1.1 创建线程

先定义一个方法

static void Test()
{
    Console.WriteLine("Starting...");
    for (int i = 1; i < 100; i++)
    {
        Console.WriteLine(i);
    }
}

Main方法中加入以下代码片段

Thread t = new Thread(Test);
t.Start();  

这样就完成了一个线程的创建.

1.1.2 暂停线程

只需要在线程调用的方法中调用Thread.Sleep方法就可以让线程暂停

static void Test()
{
    Console.WriteLine("Starting...");
    for (int i = 1; i < 100; i++)
    {
        Console.WriteLine(i);
        Thread.Sleep(TimeSpan.FromSeconds(2));  //这样就让线程暂停了两秒钟
    }
}

1.1.3 等待线程

只需要在线程开始后调用t.Join方法就可以让主程序等待直到t线程完成

Thread t = new Thread(Test);
t.Start();
t.Join();
//如果不想一直等待,也可以给它加参数
//如: t.Join(TimeSpan.FromSeconds(2));等待两秒后主线程继续运行

1.1.4 终止线程

只需要在需要终止线程的地方调用t.Abort就可以了,但这非常危险,因为t.Abort方法是给t线程注入了ThreadAbortException方法,导致线程被终结的,该异常可以在任何时刻发生并可能彻底摧毁应用程序.另外,使用该方法也不一定总能终止线程.目标线程可以通过处理该异常并调用Thread.ResetAbort方法来拒绝终止.因此并不推荐使用Abort方法来关闭线程.可优先使用一些其他方法,比如提供一个CancellationToken方法来取消线程的执行.

Thread t = new Thread(Test);
t.Start();
Thread.Sleep(TimeSpan.FromSeconds(5));
t.Abort();  //线程开始5秒后终止线程

1.1.5 检测线程状态

可以用t.ThreadState方法来获取线程当前的状态,如是否已经启动或是否处于阻塞等状态信息.由于线程是独立运行的,其状态可以在任何时候被改变,所以获取线程的当前状态是非常有用的.

Thread t = new Thread(Test);
t.Start();
Console.WriteLine(t.ThreadState);
//打印t线程当前的状态

1.1.6 线程优先级

可以使用t.Priority来设置线程的优先级,线程优先级决定了该线程可占用多少CPU时间.

Thread t = new Thread(Test);
t.Priority = ThreadPriority.Highest;
t.Start();

1.1.7 前台线程和后台线程

用t.IsBackground设置线程为前台线程和后台线程.
1.前台线程和后台线程的主要区别:进程会等待所有的前台线程完成后再结束工作,但如果只剩下后台线程,则会直接结束工作.
2.注意事项:如果程序定义了一个不会完成的前台线程,主程序并不会正常结束.

Thread t = new Thread(Test);
t.IsBackground = true;
t.Start();

1.1.8 向线程传递参数

使用t.Start传递数据,为了应用该方法,在线程中启动的方法必须接受object类型的单个参数.

static void Test(object obj)
{
    int count = (int) arg;
    Console.WriteLine("Starting...");
    for (int i = 1; i < count; i++)
    {
      Console.WriteLine(i);
      Thread.Sleep(TimeSpan.FromSeconds(2));
    }
}

Thread t = new Thread(Test);
t.Start(8);

使用lambda表达式传递参数.

static void Test(int i)
{
    Console.WriteLine(i);
}

Thread t = new Thread(()=> Test(1));
t.Start();

这可能会导致几个问题.例如在多个lambda表达式中使用相同的变量,他们会共享该变量值.例如下面这个例子,t1和t2都会打印出20,因为在这两个线程启动之前变量被修改为20.

int i = 10;
Thread t1 = new Thread(()=> Test(i));
i = 20;
Thread t2 = new Thread(()=> Test(i));
t1.Start();
t2.Start();

=>1.2线程基础(二)


  1. 赞赏支持

相关文章

  • 1.1线程基础(一)

    好记性不如烂笔头,方便以后忘记了来这里看看,还有什么没有提到的大家可以告诉我,帮忙完善,谢谢!~ Donate?[...

  • 进程与线程:线程基础、线程之间的共享和协作

    1、线程基础、线程之间的共享和协作 1.1基础概念 1.1.1 什么是进程和线程 进程是程序运行资源分配的最小单位...

  • java并发编程基础

    1.java并发基础编程基础 1.1什么是线程 线程是进程中的一个实体,线程本身是不会独立存在的。进程是代码在数据...

  • OC底层知识(十一) : 多线程

    一、简介:多线程在之前进行过一篇详细的基础博客 iOS多线程 二、多线程的基础知识回顾 1.1、iOS中的常见多线...

  • Java 并发编程

    一 多线程基础 1.1 线程的状态及其变更 1.2涉及到的各种方法 Thread.start()让线程进入就绪状态...

  • Java 并发编程(3): JAVA 并发编程基础

    1. JAVA 并发编程基础 从启动一个线程到线程间不同的通信方式. 1.1 线程 线程是系统调度的最小单位, 拥...

  • Java高级工程师学习路径

    第一章 多线程并发编程 1.1 Java基础 1.1.1 JAVA程序运行堆栈分析1.1.2 线程状态1.1.3 ...

  • java线程入门基础(二)

    java线程入门基础(二) 一、认识Java里的线程 1.1 Java里的程序天生就是多线程的 一个Java程序从...

  • 多线程

    (摘自《程序员的自我修养》) 1.线程基础 1.1 什么是线程   线程(thread),有时被称为轻量级进程(L...

  • OkHttp3源码学习(一)

    参考:http://www.jianshu.com/p/6637369d02e7 1. 线程池基础 1.1. 线程...

网友评论

    本文标题:1.1线程基础(一)

    本文链接:https://www.haomeiwen.com/subject/nbeacxtx.html