C#多线程实例

来源:互联网 发布:电子书资源 知乎 编辑:程序博客网 时间:2024/06/01 10:47

(1)关于线程

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。

如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。

(2)关于线程同步

C#线程同步可用lock(this){   //代码块  }

线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。只能一个一个进入,异步是两个线程同时进入进行操作。

同步是牺牲了执行效率来换取数据的安全(完整性),异步操作执行效率才是最高的

(3)所以想提高效率,只有把一个任务分成多个任务,然后开多个线程分别去执行这几个任务
如果不分任务都去执行这个大任务,实际上是把这个大任务执行了多次(而且不同步的话数据可能出错)

以下为实例:

(sum=-500000000  计算-500000000累加到500000000需要5秒  分成两个任务开两个线程去执行时间减少一半)

private void thread_Click(object sender, EventArgs e)        {            long sum;            Console.WriteLine("开始时间:"+ DateTime.Now);            MyThread myThread1 = new MyThread(-500000000, 0);            ThreadStart childref1 = new ThreadStart(myThread1.CallToChildThread);            Thread childThread1 = new Thread(childref1);            MyThread myThread2 = new MyThread(0, 500000000);            ThreadStart childref2 = new ThreadStart(myThread2.CallToChildThread);            Thread childThread2 = new Thread(childref2);            childThread1.Name = "线程A";            childThread2.Name = "线程B";            childThread1.Start();            childThread2.Start();            childThread1.Join();            childThread2.Join();//Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止            // 停止主线程一段时间            //Thread.Sleep(20000);            // 现在中止子线程          //  Console.WriteLine("In Main: Aborting the Child thread");           // childThread1.Abort();            //Console.ReadKey();            sum=myThread1.sum + myThread2.sum;        }

public class MyThread    {        private long i;        public long sum=0;        private int iCol;        private int iRow;        private long start;        private long end;        public MyThread(long start,long end)        {            this.start = start;            this.end = end;        }        public  void CallToChildThread()        {            for (i = start; i < end; i++)            {   //同步的话执行效率变慢                    // Thread.Sleep(1);  //加上sleep后才真正实现同步                     //Console.WriteLine(Thread.CurrentThread.Name + i);                sum += i;             }             Console.WriteLine(Thread.CurrentThread.Name +"结束"+DateTime.Now);             Console.WriteLine(Thread.CurrentThread.Name + "结束");              }}



原创粉丝点击