• 多线程与工作流


     

    本文不是讲多线程,也不是讲在多线程中使用工作流什么的,而是用设计多线程的思路讲一下工作流的工作思想。

    NET中的System.Threading.Thread的例子很简单,以至于许多程序员只学了几个小时就以为自已会多线程开发的。没有直正写过多线程的人是无法体会多线程是多么的..

    很多人上手WF总是觉得一些功能的实现有些怪,特另是宿主与实例或实例与实例通信这部分。

    我用多线程的思路讲一下:

    (注:如果你对AbortInterrupt方法非常了解,本文对你来说没有什么技术上的意义)

    Abort,强行终止线程

    class 要参与多线程的类

    public void 方法()

        int i = 0;

           try

            {

               while (i<3000)

               { i = i + 1; Console.WriteLine(i); }

             }

            catch (ThreadInterruptedException e)

            { Console.WriteLine("Interrupt方法引发的: " + e.Message);}

        }

    }

            Thread 线程对象= new Thread((new 要参与多线程的类()).方法);

            线程对象.Start();

            System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿

            线程对象.Abort();

            Console.WriteLine("主线程完成");

            Console.Read();

    线程对象.Abort();方法会硬生生的将线程终止,如while中的i循环到234就被终止了

    这样很不好,特别是在对资操作时。而且无法捕获到异常

    Interrupt,当线程不再做任何有意义的工作时,终止线程

    class 要参与多线程的类

    public void 方法()

        int i = 0;

           try

            {

               while (i<5000)

               { i = i + 1; Console.WriteLine(i); }

             }

            catch (ThreadInterruptedException e)

            { Console.WriteLine("Interrupt方法引发的: " + e.Message);}

        }

    }

            Thread 线程对象= new Thread((new 要参与多线程的类()).方法);

            线程对象.Start();

            System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿

            线程对象.Interrupt();

            Console.WriteLine("主线程完成");

            Console.Read();

    不会终止上例,因为上例的线程从来都没进入过WaitJoinSleep状态,当然也不会产生异常

    class 要参与多线程的类

    public void 方法()

        int i = 0;

           try

            {

               while (i<5000)

               {

                   System.Threading.Thread.Sleep(1);

                   i = i + 1; Console.WriteLine(i);

               }

             }

            catch (ThreadInterruptedException e)

            { Console.WriteLine("Interrupt方法引发的: " + e.Message);}

        }

    }

            Thread 线程对象= new Thread((new 要参与多线程的类()).方法);

            线程对象.Start();

            System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿

            线程对象.Interrupt();

            Console.WriteLine("主线程完成");

            Console.Read();

    由于添加了 System.Threading.Thread.Sleep(1);,线程会进入WaitJoinSleep状态,线程对象.Interrupt()生效,线程终止,可以捕获到异常,并可以异常中作一些收尾工作

    还有这个

    class 要参与多线程的类

    public void 方法()

        int i = 0;

           try

            {

               while (i<5000)

               {

                   i = i + 1; Console.WriteLine(i);

               }

                System.Threading.AutoResetEvent w = new AutoResetEvent(false);

               w.WaitOne();

               Console.WriteLine("---");

             }

            catch (ThreadInterruptedException e)

            { Console.WriteLine("Interrupt方法引发的: " + e.Message);}

        }

    }

    AutoResetEventThread.SleepInterrupt()方法性质一样

    所以我在设计要参与多线程的方法时会类似可能会这样

    Void 方法()

    {

    逻辑代码单元1;

    System.Threading.Thread.Sleep(1)

    逻辑代码单元2;

    System.Threading.AutoResetEvent w = new AutoResetEvent(false);

    w.WaitOne();

    逻辑代码单元3;

    System.Threading.Thread.Sleep(1)

    }

    我要与另一个线程正在使用的对象通信时,我会让那个线程被一个w.WaitOne()阻塞,当通信完成时w.Set(),让那个线程继续。

    当然还会有lock的技巧,这里就不说了。

    我要说的是

    Thread.Sleep,AutoResetEvent,以及我所说的通信方式,

    在工作流是对应的是什么…….大家自已想吧,

    你要想从一条流动的河中取出一瓢水,看完后想再将其放回源除,让时间对这条河暂停吧

  • 相关阅读:
    解决:webpack打包js项目ie11浏览器下报promise 未定义
    vue+element form 动态改变rules校验数据
    git 常用操作记录
    康佳LED42R6610AU刷机
    linux驱动开发环境的建立
    linux驱动笔记-设备驱动入门
    我的第一个裸机程序
    ES6new Promise()使用方法
    vue3 区别于 vue2 的“与众不同”
    10个常用的JS工具库,80%的项目都在用
  • 原文地址:https://www.cnblogs.com/foundation/p/564019.html
Copyright © 2020-2023  润新知