Java进击C#——语法之多线程
本章简言 |
上一章中笔者对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#——语法之多线程相关推荐
- java基础(六)多线程/设计模式
这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderfu ...
- Java高阶语法---final
背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...
- Java基础1语法准备
77集程序底层执行 初识Java 1.1计算机语言发展史以及未来 计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言. ·第一代语言:机器语言(相当于人类的原始阶段) 机器语言 ...
- Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)
Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...
- Java 编程基础语法篇
目录 前言 一.二进制 1.1 补码 1.2 二进制和十进制之间的互换 二.变量与数据类型 2.1 变量分类 2.2 数据类型 2.3 类型转换 2.4 关键字大全 三.方法的使用 3.1 概述 3. ...
- java与javaScript 语法的区别
目录 前言 一.java和javaScript是什么?有何不同? 1.java简介 2.javaScript简介 二,语法区别 -1.语法基础 java语言基础 Js语法基础 -2.数据类型 java ...
- 判断三角形java代码_小猿圈Java循环嵌套语法的使用介绍
Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...
- command对象提供的3个execute方法是_前阿里P9的Java面试重点3:多线程
1. 并行和并发有什么区别? 并行:多个处理器或多核处理器同时处理多个任务. 并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行. 如下图: 并发 = ...
- 浅析java中的语法糖
概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...
最新文章
- python入门(三)-- 基本运算符
- linux下载哪个python版本-Linux安装python3.6
- 使用littleTools简化docker/kubectl的命令
- 乐源机器人优点跟缺点_机床实现自动化上下料选桁架机械手还是关节机器人好?...
- italic与oblique的区别
- 启用vsftpd服务
- mongodb聚合查询优化_【MongoDB】MongoDB 性能优化 - BI查询聚合
- Hadoop2.6.0完全分布式安装
- 如果不清楚设计方向,圣诞设计模板可以帮助你轻松建立节日主题。
- tomcat查看当前内存
- Android开发环境搭建-eclipse+ADT及hello world
- SpringCloud + RocketMQ实现可靠消息最终一致性事务
- python google地图_Google地图下载
- “职业丑人”:大公司雇“职业杀手”大裁员
- 爬虫技巧-西瓜视频MP4地址获取
- 近端串扰与远端串扰分析
- 机器学习的「反噬」:当 ML 用于密码破解,成功率竟然这么高!
- 洛谷 P1617 爱与愁的一千个伤心的理由
- Android学习之nbsp;Launcher抽屉类Slid…
- 关于在线评论有用性的论文研读笔记---41-50篇
热门文章
- 年薪百万程序员竟遭亲妈拍卖:才拍到10块,还不够买一盒鸡蛋!
- 在千锋学前端的卢同学“不甘于落后,不安于现状”
- 温故而知新,8张 Javascript 思维导图助你成长
- web前端新人第一课:html基础知识,你能学会吗?
- 「开发小技巧」07—如何使用HTML和CSS创建图像叠加图标?
- 扫地机器人湿地_仅仅是打湿地板而已?定价高了,石头扫地机器人的拖地却仍很一般...
- java制作霓虹灯_Java 线程编码之霓虹灯的实现
- springboot 读写分离_springboot +ShardingJDBC 读写分离
- 易语言html到画板,易语言画板使用方法图解
- 易语言不用uac权限写到c盘,易语言制作UAC管理员模式添加器