当前位置:编程学习 > C#/ASP.NET >>

一个关于线程的问题。请大家解释一下。谢谢。急。。。

using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;
namespace RunThreads
{
    public class Class1
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "MAIN";
            Console.WriteLine("[{0}] Hello.",Thread.CurrentThread.Name);
            Thread workerThread=new Thread(new ThreadStart(WorkerMethod));
            workerThread.Name = "WORKER";
            Console.WriteLine("[{0}] Create the new worker thread,{1}",Thread.CurrentThread.Name,workerThread.Name);
            workerThread.Start();//这里有点小困惑,是不是这里直接用Start()就可以直接运行被委托的方法了。
            while(workerThread.IsAlive)//是不是这里加上子线程后判断时候存在后,就开始自动打印出来了。
            {
            }
            Console.WriteLine("Looks like the worker thread finished its job.");
            Console.ReadLine();
        }
        static void WorkerMethod()
        {
            for (int i = 0; i < 20;i++ )
            {
                Console.WriteLine("[{0}] Doing some work.",Thread.CurrentThread.Name);
            }
        }
    }
}

运行结果如下

两个问题:
一、workerThread.Start();//这里有点小困惑,是不是这里直接用Start()就可以直接运行被委托的方法WorkerMethod()了,感觉似乎很难懂,而且打印出的怎么是在循环里面出现的。急
二、while(workerThread.IsAlive)//是不是这里加上子线程后判断时候存在后,就开始自动打印出来了。

--------------------编程问答-------------------- 看不大懂问的是什么!

workerThread.Start();被调用后系统会创建一个新的线程并运行,并不是简单的调用委托的方法。
while(workerThread.IsAlive)加上这个判断只是要阻塞主线程,和打印没关系 --------------------编程问答--------------------
引用 1 楼 jch1983 的回复:
看不大懂问的是什么! 

workerThread.Start();被调用后系统会创建一个新的线程并运行,并不是简单的调用委托的方法。 
while(workerThread.IsAlive)加上这个判断只是要阻塞主线程,和打印没关系


workerThread.Start();对的,这个新线程确实运行了,但是他运行的毕竟还是那个被委托的方法。我想问的是,他还能运行其他的什么吗?似乎start一开始,被委托的方法也开始了。
while(workerThread.IsAlive){Console.WriteLine(workerThread.ThreadState);}我在这个函数体中又加了打印当前状态的打印语句。结果竟然是这样的。

这两句放在一起是不是交替运行的,不然怎么会出现如此的输出状况。实在是不懂。急啊。。。 --------------------编程问答-------------------- 1)“他还能运行其他的什么吗?”是指主线程Main()还是WorkerMethod()?
2)while(workerThread.IsAlive)在主线程里运行,WorkerMethod()启动后在另一个线程里执行,它们应该交替(或
许)吧,其顺序有随机现象。 --------------------编程问答--------------------
引用 3 楼 hulihui 的回复:
1)“他还能运行其他的什么吗?”是指主线程Main()还是WorkerMethod()? 
2)while(workerThread.IsAlive)在主线程里运行,WorkerMethod()启动后在另一个线程里执行,它们应该交替(或 
许)吧,其顺序有随机现象。


是吗?似乎还是不解,期待中。。。 --------------------编程问答-------------------- 很正常啊。多线程本来就是各运行各的(如果没有同步机制),有点类似并行处理(本质上不同)。所以,你的输出中交叉打印两个循环的执行结果。 --------------------编程问答--------------------
引用 5 楼 hulihui 的回复:
很正常啊。多线程本来就是各运行各的(如果没有同步机制),有点类似并行处理(本质上不同)。所以,你的输出中交叉打印两个循环的执行结果。


冒泡帮顶接分 --------------------编程问答-------------------- 首先你应该明白线程是并行的两个程序,宏观上是并行,
但在CPU处理的时候,
由于CPU的数量小于线程数量所以cpu就要在不同的线程中切换
解释你上面截图应该是
主线程启动工作线程 输出Running
子线程获得时间片                 输出4个 Doing some work.
子线程时间到,主线程获得时间片   输出线程工作状态 waitsleepjoin
主线程时间到,子线程获得时间片   输出4个 Doing some work.
.....
其次,除了cpu之外两个线程都要在控制抬输出内容,即使你有多CPU能够同时执行主线程和子线程
也会因为征用资源相互等待,在输出的内容看好象是串行一样。 --------------------编程问答--------------------
引用 5 楼 hulihui 的回复:
很正常啊。多线程本来就是各运行各的(如果没有同步机制),有点类似并行处理(本质上不同)。所以,你的输出中交叉打印两个循环的执行结果。

这个还与操作系统的对多线程的处理方式有关
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,