码迷,mamicode.com
首页 > 编程语言 > 详细

C#多线程学习一

时间:2017-01-22 18:19:01      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:for   ring   image   threading   共享   using   img   运行   http   

1、概述:C#支持多线程并行执行程序,一个线程有他单独的执行路径,能够与其他线程同时执行,一个程序是由一个单线程开始,该单线程由CLR(公共语言运行时)和操作系统创建而成,并具有多线程创建额外线程的功能。

 

(1)、主线程和子线程分别执行不同的任务

using System;
using System.Threading;
namespace MuliThreading
{
    class Thread1
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(writeY);   //为该类传入一个方法(委托)
            t.Start();
            while (true) Console.Write("x");
        }
        static void writeY()
        {
            while (true) Console.Write("y");
        }

        //代码解读:主线程创建了一个新线程t,t传入的是writeY方法,重复打印y,同时主线程打印x,主线程和新线程同时执行
        
    }
}

输出结果:技术分享

无限输出x和y;

 

(2)主线程和子线程分别执行相同的任务

using System;
using System.Threading;

namespace Mulithreading
{
    class Thread2
    {
        static void Main(string[] args) {
            new Thread(Go).Start();
            Go();
        }
        static void Go() {
            for (int i = 0; i < 5; i++) {
                Console.Write("?");
            }
        }
        //代码解读:在主线程中创建了一个子线程,主线程和子线程同时执行Go()
    }
}

输出:技术分享

 

(3)主线程和子线程使用同一目标的公共实例

using System;
using System.Threading;

namespace Mulithreading
{
    class Thread3
    {
        bool done;
        static void Main(string[] args)
        {
            Thread3 t3 = new Thread3();
            Thread t = new Thread(t3.Go);
            t.Start();
            t3.Go();

        }
        void Go() {
            if (!done) { done = true; Console.Write("done"); }
        }

        //代码解读:主线程Main()方法和在其中定义的子线程所调用的GO()方法共享以一个公共属性done,当吊用子线程时,对done的修改会影响到主线程的使用,因为两个线程在理论上讲是同时执行,但是实际上不可能精确的同时执行,所以当主线程吊用Go()方法是done为true
    }
}

输出:done

(4)主线程和子线程使用同一目标属性可能会出现的问题

using System;
using System.Threading;
namespace Mulithreading
{
    class Thread4
    {
        bool done;
        static void Main(string[] args)
        {
            Thread4 t4 = new Thread4();
            new Thread(t4.Go).Start();
            t4.Go();
        }
        void Go()
        {
            if (!done) { Console.Write("done"); done = true; }
        }
        //代码解读:当在主线程中吊用子线程时,注意两个线程是同时进行的,所以当子线程吊用Go()方法并执行时,主线程也同时进行吊用执行,两个线程是并行的,所以他们同时输出了done
    }
}

输出:done  done

 

C#多线程学习一

标签:for   ring   image   threading   共享   using   img   运行   http   

原文地址:http://www.cnblogs.com/GreenLeaves/p/6340960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!