1.什么是线程?

进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。

2.前台线程和后台线程的区别?

程序关闭时,后台线程直接关闭,但前台线程会执行完后关闭。

通过Thread类新建线程默认为前台线程。其他方式创建的都是后台线程。

多线程的几种方式

一. 异步多线程

        static void Main(string[] args)
{
Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
for(int i = 0; i< 5;i++)
{
Action<string> action = t =>
{
for(int k = 0; k< 1000000000;k++)
{ }
Console.WriteLine("当前参数是{0},当前线程是{1}",t,Thread.CurrentThread.ManagedThreadId);
}; action.BeginInvoke("参数是" + i, null, null);
}
Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
Console.Read();
}
}

二. Threads线程

        static void Main(string[] args)
{
Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
for(int i = 0; i< 5;i++)
{
ParameterizedThreadStart threadStart = t =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
}; Thread thread = new Thread(threadStart); thread.Start(i);
}
Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); Console.Read();
}

三. ThreadPool线程池

        static void Main(string[] args)
{
Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);
for(int i = 0; i< 5;i++)
{
WaitCallback waitCallback = t =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
}; ThreadPool.QueueUserWorkItem(waitCallback, i);
}
Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); Console.Read();
}

四. Task

        static void Main(string[] args)
{
Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); TaskFactory taskFactory = new TaskFactory(); for (int i = 0; i< 5;i++)
{
Action<object> action = t =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是{0},当前线程是{1}", t, Thread.CurrentThread.ManagedThreadId);
}; taskFactory.StartNew(action,i);
}
Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); Console.Read();
}

五. Parallel

        static void Main(string[] args)
{
Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); Action action1 = () =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是1,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
};
Action action2 = () =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是2,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
};
Action action3 = () =>
{
for (int k = 0; k < 1000000000; k++)
{ }
Console.WriteLine("当前参数是3,当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
}; Parallel.Invoke(action1, action2, action3); Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId); Console.Read();
}

上面简单介绍了5种多线程的使用方式,后续文章会记录每种多线程的详细使用方法.

c# 多线程的几种方式的更多相关文章

  1. c#使用多线程的几种方式示例详解

    本文转载自:http://www.jb51.net/article/46234.htm 本文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧 (1)不需要传递参数 ...

  2. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

  3. java多线程系类:基础篇:02常用的实现多线程的两种方式

    本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多 ...

  4. Java实现多线程的两种方式

    实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...

  5. 创建多线程的第一种方式——创建Thread子类和重写run方法

    创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...

  6. Java实现多线程的三种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.前两种方式启动的线程没有返回值 ...

  7. Java中实现多线程的四种方式

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  8. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  9. JAVA实现多线程的四种方式

    JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...

随机推荐

  1. Git复习步骤

    1.首先肯定是安装与配置了 首先要下载Git,然后设置用户名/邮箱 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...

  2. [数据结构] 2.7 Heap 堆

    * 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 1.堆是什么? (如图所示是一个小堆) 1)堆是一颗完全二叉树,它的最后一层不是满的,其他每一层都是满的,最后一层从左到右也没有空隙 ...

  3. vue中<select>绑定事件

    <div id="app"> <select v-model="selectItem" @change="selectFn($eve ...

  4. vue-quill-editor富文本编辑器,上传图片自定义为借口上传

    vue-quill-editor富文本编辑器,上传图片自定义为借口上传 博客地址:https://blog.csdn.net/lyj2018gyq/article/details/82585194

  5. Jenkins安装使用教程

    一.说明 持续集成:Continuous integration,CI.包括两层含义,一是指项目的每个开发人员每天都向项目代码仓库要通过git等提交他们的代码,二是指在代码提交后实现自动化的构建.部署 ...

  6. 移动App测试中的最佳做法

    一说起软件测试,测试员想到肯定是去检查文件,功能,API,性能并确定软件是否安全,以及关于软件特定部分的其他事项.但是对于移动测试,测试员不得不基于用户移动使用模式考虑移动相关的功能. 本文是基于我的 ...

  7. 关于分布式代码管理工具git

    一.安装 Step1  进入官网https://www.git-scm.com/download/下载,然后安装,一直“下一步”即可 Step2  验证是否安装成功,在任意地方右键,菜单中含有Git ...

  8. 【技巧】easyUI的datagrid,如何在翻页以后仍能记录被选中的行

    easyUI的datagrid在复选框多选时,如何在翻页以后仍能记录被选中的行: 注意datagrid中需要配置idField属性,一般为数据的主键

  9. log4j的详细配置

    https://www.cnblogs.com/juddhu/archive/2013/07/14/3189177.html(原文链接) 先说下我的需求 1,可以记录日记在我们的java开发项目周期中 ...

  10. XenServer 自动化布署 (关键词: PXE ANSWER SCRIPT)

    XenServer 6.x PXE自动化布署: 测试环境:win10 + Tiny pxe server 1.0.2,采用gpxelinux.0 时间:2017.1.10 PXE远程安装: 1)def ...