zoukankan      html  css  js  c++  java
  • 多线程与工作流

     

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

    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,以及我所说的通信方式,

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

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

  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/foundation/p/564019.html
Copyright © 2011-2022 走看看