Java进击C#——语法之多线程

本章简言

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

Thread类

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

C#:

 1  class Program
 2     {
 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。里面有各种方法让你学习。

本章总结

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

时间: 2024-10-04 18:27:54

Java进击C#——语法之多线程的相关文章

Java进击C#——语法之线程同步

上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几年来的.NET开发可以了解到的同步方式至少有四种以上.如.lock.volatile.Monitor等. lock方式 对lock的关键字作用跟JAVA的synchronized关键字类似.但有一定的差别.JAVA的synchronized关键字可能修饰在方法上面.可惜C#却不能修饰在方法上面.用法

Java进击C#——语法之知识点的改进

本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知识点更是让C#在写法上更加的多样性.有些写法还真的让笔者觉得很有不错.由于这一部分的知识更多是C#独有的.很有难用JAVA这边的知识来讲.所以这章可能会纯C#了.虽然在JAVA 7 和JAVA 8中出现很多特性.可惜笔者却没有认真的学习一下新特性. 初始化语法的改进 一.类的初始化方式.类初始化的时

Java进击C#——语法之面向对象

本章简言 上一章笔者讲到关于ADO.NET相关的知识,知道了如何去访问数据库.本章将来讲关于面向对象的思想.不管在JAVA还是在C#面向对象思想的重要性都是占了一个很大的成份.往往他就像呼吸一样子,更多的时候我们会忽略.面向对象编程有三大特性:封装.多态.继承.关于这三大特性的定义笔者不会过多的介绍.网络上类似这样子的文章一搜一片.相信里面肯定有你需要的.而本系列主要目标是想让JAVA程序员进入C#的开发环境.所以更多会在俩者之间的差别进行讲解. 类和对象 在进入面向对象思想的讲解之前,笔者认为

Java进击C#——语法之ADO.NET

本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分的知识点了.笔者根据使用数据库方式的不同又分为有线连接和无线连接(关于有线和无线的叫法是笔者个人定义的.因为看了不同的书里面很多叫法).不管是什么样子的叫法.只要明白有线是保持连接的状态下操作数据库.而无线是连接之后复制一份副本,关闭连接,对副本进行操作之后,在连接更新数据库.笔者认为如果只是使用的

Java进击C#——语法之IO操作

本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向.不至于不知道学习些什么. File类 这一个静态类.可以说是一个工具类吧.他里同包含了很多关于处理文件的功能.笔者只是列出常用的一些功能.更多的希望读者们自行去了解. 1.打开一个文件流.打开方式有很三种.如下代码 public static FileStream Open(string path

Java进击C#——应用开发之Linq和EF

本章简言 上一章笔者对于WinForm开发过程用到的几个知识点做了讲解.笔者们可以以此为开端进行学习.而本章我们来讲一个跟ORM思想有关的知识点.在讲之前让我们想一下关于JAVA的hibernate知识点.hibernate也是ORM框架.记得hibernate里面有一个叫HQL.先不管HQL的好与坏.主要是明白HQL的目地是什么.ORM的思想就是为了让用户在操作数据的时候用上面向对象的思想来看,而不是二维数据了.所以HQL笔者认为就是一个面向对象思想的SQL语句.那么为什么笔者要讲到HQL呢?

Java进击C#——应用开发之WinForm开发

本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是如果是游戏相关的话,不好意思!笔者觉得你可能选错语言了.C++可能更合适你.有一点希望读者们明白.下列讲到的内容是笔者在开发用的.只能辅助你学习,却不能成为教材.上一章讲到WinForm开发就是JAVA的Awt和Swing编程.笔者在做Awt和Swing已经过去四年多了.如果记得没有错的话,在设计窗

Java进击C#——前言

本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这样子好死不死跟着他一起创业三年了.最开始过去的时候才知道原来公司是用C#开发.对于我这个主攻Java的来讲,内心深处还有一点压力.没有办法!只能转C#了.于是我便开始了我的JAVA进击C#之旅了. 在日本的时候,笔者对于C#开发虽然有一定的了解.可是却没有更深入的了解C#相关的开发知识点.所以三年过

Java的基本语法

Java的基本语法 ·String是字符串类型关键字,属于引用数据类型,不能通过强制类型转换的方式转换为基本数据类型: 但是可以通过方法的方式进行转换: ·进制 1,对于整数,有四种表示方式: 二进制->0.1,满2进1,以0b或0B开头表示 十进制->0-9,满10进1 八进制->0-7,满8进1,以数字0开头表示 十六进制->0-9及A-F,满16进1,以0x或0X开头表示,其中A-F不区分大小写 所有的数字在计算机的底层都是以二进制的形式存在的,计算机以补码的形式保存所有的整