本章简言

上一章中笔者对C#一些独有的语法点进行讲解,相信也可以看C#的一些神奇之处。那么本章主要是放在多线程这方面的知识。不管是C#还是JAVA在开发过程或多或少都会用到关于多线程的编程。当然笔者不可能把多线程的知识点讲的很全面。笔者这里只是讲一些笔者常用到的。如果有兴趣的朋友,笔者希望主动性去查找一下资料。

Thread类

对于Thread类相信JAVA的朋友一点也不陌生。在一点上C#到是跟JAVA很类似。只是在使用上有一定差别。首先要明白C#的多线程功能一般都是在命名空System.Threading下面。至于什么是线程,进程又是什么这样子的问题。笔者就不多说了。相信大家都明白。笔者还是喜欢直接一点。让我们看一下代码进行学习吧。

C#:

 1  class Program2     {3         static void Main(string[] args)4         {5             Thread myThread1 = new Thread(() =>6             {7                 Console.WriteLine("这是一个lambda表达式 创建线程");8             });9
10             Thread myThread2 = new Thread(ThreadStartImp);
11
12             Thread myThread3 = new Thread((object obj) =>
13             {
14                 Console.WriteLine("这是一个lambda表达式创建有参数的线程 参数:" + obj.ToString());
15             });
16
17             myThread1.Start();
18             myThread2.Start();
19             myThread3.Start("aomi");
20
21         }
22
23         public static void ThreadStartImp()
24         {
25             Console.WriteLine("这是一个用方法创建线程");
26         }
27
28
29     }

笔者在上面创建三个线程代码。myThread1和myThread2是同一种线程。即是没有参数的线程。myThread3是有参数的线程。不管是不是有参数。使用方式基本是一样子的。有参数的话,就是调用Start方法的时候给他传入一个参数即可。我们可以看到使用上跟JAVA有一个很大的差别。JAVA的Thread类构造函数的参数传入Runnable接口。可惜C#不是。如下代码。

C#:

public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);

这段代码是源码里面的。选中Thread类按F12就可以大概的查看Thread类的结构。我们看可以看到四个构造函数。我们常常用到只是俩个:Thread(ParameterizedThreadStart start)和Thread(ThreadStart start)。刚刚看到的时候我一直以为ThreadStart会跟JAVA的Runnable接口一样子。只到按F12进入查看一下结构才明白大错特错。如下代码

C#:

[ComVisible(true)]
public delegate void ThreadStart();

C#:

[ComVisible(false)]
public delegate void ParameterizedThreadStart(object obj);

我们可以清楚的看到一个关键字delegate。相信有看过上一章的朋友都知道他是跟事件有关系。没有错。就是定义一个委托类型。以便将来用于传方法。所以我们可以明白这边的Thread类的构造函数的参数只能传入方法。那么相信笔者上面的三个线程的定义的意义也很明显了。

myThread1线程:笔者用的是lambda表达式来创建。lambda表达是什么上一章也有简单的讲到。

myThread2线程:外面定义一个方法用于实现多线程。这方法可以是一个静态方法也可以是一个对象的方法。关键字static的功能跟JAVA一样子。

myThread3线程:实现有一个有参数的多线程。

上面只是讲到关于Thread类的使用。对于Thread类对象里面的一些方法的话,笔者就不多介绍了。大至跟JAVA的Thread类一样子。如Interrupt方法。请读者们自行查看。

ThreadPool类

当我们谈到多线程池的时候,相信大家都知道是什么东西。C#用的是ThreadPool类。只是可惜笔者在JAVA这边用到多线程池的机会不多。所以也不清楚JAVA中的ThreadPoolExecutor类和Executors类跟C#的ThreadPool类相差多少。不过有兴趣的朋友可以看一下。笔者这里还是讲一下ThreadPool类的使用吧。ThreadPool类更多的时候有一点像工具类一样子。如下面代码。

C#:

 class Program{static void Main(string[] args){ThreadPool.QueueUserWorkItem((obj) =>{Console.WriteLine("这是一个lambda表达式创建有参数的线程 参数:" + obj.ToString());});ThreadPool.QueueUserWorkItem(WaitCallbackImp);}public static void WaitCallbackImp(object obj){Console.WriteLine("这是一个用方法创建线程");}}

上面的代码跟上面的Thread类有一点类似。可是本质上却有很大的差别。这里是用多线程池的。另外对于多线程池的设置。只要ThreadPool.XXXXX里面有很多方法让你去设置。

Task类

如果你们有用上面的Thread类你就会发现,有时候当线程在运行中的时候很难停止。但是如果你用了Task类的话,你就会发现这个难点已经不存在了。我也不清楚C#为什么会引入Task类。可能就是因为Thread类和ThreadPool类太难控制吧。那么这不是笔者关注的问题。让我们看一下Task类是如何使用的。Task类是中文常常叫做任务。所以就是有一种说法。是单任务还是多任务。为什么笔者会这样子讲呢?如下。

1.单任务。即是一个Task类实例。这个时候就比较简单。代码如下

  class Program{static void Main(string[] args){CancellationTokenSource cts = new CancellationTokenSource();//用于中途取消Task myTask = new Task((obj) =>{Console.WriteLine("这是一个单任务");}, cts);myTask.Start();Console.ReadKey();}}

这里面笔者只用到了一个类CancellationTokenSource。这个类就是用于取消任务。还是让笔者写一个例子吧。

 class Program{static void Main(string[] args){CancellationTokenSource cts = new CancellationTokenSource();//用于中途取消Task myTask = new Task((obj) =>{Console.WriteLine("这是一个单任务");Thread.Sleep(20000);//让他睡一段时间}, cts);myTask.Start();if (cts.IsCancellationRequested)//判断是否取消{cts.Cancel();}Console.ReadKey();}}

2.多任务。就是多个Task类的实例进行配合。这个时候就有谁先做。谁后做的问题。

 class Program{static void Main(string[] args){CancellationTokenSource cts1 = new CancellationTokenSource();//用于中途取消Task myTask1 = new Task((obj) =>{Console.WriteLine("这是一个单任务");//Thread.Sleep(20000);//让他睡一段时间}, cts1);CancellationTokenSource cts2 = new CancellationTokenSource();//用于中途取消myTask1.ContinueWith((task) => {Console.WriteLine("myTask2任务");}, cts2.Token);myTask1.Start();//if (cts1.IsCancellationRequested)//判断是否取消//{//    cts1.Cancel();//}Console.ReadKey();}}

上面的ContinueWith方法就是表示:当myTask1结束之后,就可以继续红色的代码。即是另一个Task任务。除了上面的实例之后,还有一种用法。代码如下。

CancellationTokenSource cts3 = new CancellationTokenSource();//用于中途取消
Task.Factory.StartNew((obj) =>
{Console.WriteLine("这是一个用的Factory单任务");}, cts3);

看样了不用笔者多说了。有一点类似于多线程池的概念。只是注意Task.Factory里面还有一些很好用的功能。ContinueWhenAll方法就是一个很好的体现。和上面的ContinueWith有一个像。即是所以的task结束之后才执行对应的最后一个task。请用Task.Factory.让他提示进行学习。如果不提示的话,写完上面的"ask.Factory."之后按Ctrl+J。里面有各种方法让你学习。

本章总结

本章主要是对多线程常用的一些知识进行讲解。笔者并没有对他们进行详细的说明。所以希望读者们可以根据笔者所讲的继续深入下去。

转载于:https://www.cnblogs.com/luozhijun/p/6886316.html

Java进击C#——语法之多线程相关推荐

  1. java基础(六)多线程/设计模式

    这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderfu ...

  2. Java高阶语法---final

    背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...

  3. Java基础1语法准备

    77集程序底层执行 初识Java 1.1计算机语言发展史以及未来 计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言. ·第一代语言:机器语言(相当于人类的原始阶段) 机器语言 ...

  4. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  5. Java 编程基础语法篇

    目录 前言 一.二进制 1.1 补码 1.2 二进制和十进制之间的互换 二.变量与数据类型 2.1 变量分类 2.2 数据类型 2.3 类型转换 2.4 关键字大全 三.方法的使用 3.1 概述 3. ...

  6. java与javaScript 语法的区别

    目录 前言 一.java和javaScript是什么?有何不同? 1.java简介 2.javaScript简介 二,语法区别 -1.语法基础 java语言基础 Js语法基础 -2.数据类型 java ...

  7. 判断三角形java代码_小猿圈Java循环嵌套语法的使用介绍

    Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...

  8. command对象提供的3个execute方法是_前阿里P9的Java面试重点3:多线程

    1. 并行和并发有什么区别? 并行:多个处理器或多核处理器同时处理多个任务. 并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行. 如下图: 并发 = ...

  9. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

最新文章

  1. EOS 账号创建和信息查询
  2. C#中Invoke的用法
  3. UITableViewCell有关处理touch事件的问题
  4. 分布式数据库一定会替代Oracle吗?
  5. 深入理解脚本化CSS系列第二篇——查询计算样式
  6. 用 dash_bootstrap_components 为 dash 生成美观的导航栏
  7. MVC +EF+linq 多表联查
  8. Microsoft Virtual Lab Use Guide
  9. 如何利用用户ID号、关键词或视频时长在自媒体视频软件上批量采集下载关于在自媒体视频软件上批量采集...
  10. 基于PageRank的社交网络用户影响力
  11. 笔记本java稳定wifi信号_笔记本wifi网速不稳定的解决方法
  12. base64加密及方式
  13. Encountered a duplicated sql alias [NAME] during auto-discovery of a native-sql query
  14. MySQL常规篇之增删改查(精选)
  15. word每行的末尾箭头怎么去掉_word文档后面的箭头怎么去掉
  16. zabbix自定义监控项及触发动作
  17. 解决tomcat启动时的45秒时间限制
  18. 求1!+2!+....+10!
  19. window双网卡负载均衡
  20. 关于Delphi通用涵数

热门文章

  1. 程序员1年经验包装成5年,转正时领导:试用期不想过了?
  2. 百家号 python高手养成_python高手养成记04:python的所有数据类型,一篇足矣
  3. 热电偶校验仪_热电偶校验方法_南昌手持热工校验仪,杭州全功能热工过程校验仪厂家...
  4. 系列有什么区别_哈弗的F系列和H系列,有什么区别?
  5. java对比swith和if的不同,浅谈选择结构if语句和switch语句的区别
  6. 关于大量数据的随机打乱重保存.(少了详细解释,之后会更新)
  7. 开源,并不意味着免费、开源,不是道德绑架
  8. 51Nod:1268 和为K的组合
  9. JavaScript 原型总结三 函数和对象的关系
  10. 【tyvj1520】 树的直径