在WIndows上进行多线程处理

时间:2011-08-12 23:13:44

标签: c# multithreading

using System;
using System.Threading;

// Simple threading scenario:  Start a static method running
// on a second thread.
public class ThreadExample {
    // The ThreadProc method is called when the thread starts.
    // It loops ten times, writing to the console and yielding 
    // the rest of its time slice each time, and then ends.
    public static void ThreadProc() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(0);
        }
    }

    public static void Main() {
        Console.WriteLine("Main thread: Start a second thread.");
        // The constructor for the Thread class requires a ThreadStart 
        // delegate that represents the method to be executed on the 
        // thread.  C# simplifies the creation of this delegate.
        Thread t = new Thread(new ThreadStart(ThreadProc));

        // Start ThreadProc.  Note that on a uniprocessor, the new 
        // thread does not get any processor time until the main thread 
        // is preempted or yields.  Uncomment the Thread.Sleep that 
        // follows t.Start() to see the difference.
        t.Start();
        //Thread.Sleep(0);

        for (int i = 0; i < 4; i++) {
            Console.WriteLine("Main thread: Do some work.");
            Thread.Sleep(0);
        }

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
        t.Join();
        Console.WriteLine("Main thread: ThreadProc.Join has returned.  Press Enter to end program.");
        Console.ReadLine();
    }
}

结果是:

 Main thread: Start a second thread.
 Main thread: Do some work.
 ThreadProc: 0
 Main thread: Do some work.
 ThreadProc: 1
 Main thread: Do some work.
 ThreadProc: 2
 Main thread: Do some work.
 ThreadProc: 3
 Main thread: Call Join(), to wait until ThreadProc ends.
 ThreadProc: 4
 ThreadProc: 5
 ThreadProc: 6
 ThreadProc: 7
 ThreadProc: 8
 ThreadProc: 9
 Main thread: ThreadProc.Join has returned.  Press Enter to end program.

我不明白为什么“ThreadProc 0”“1”“2”“3”可以出现在“主线程:做一些工作”之间。

有人可以帮我解释一下吗?谢谢!

5 个答案:

答案 0 :(得分:1)

“t.Start()”行启动另一个同时运行的线程,而主线程正在执行它。

答案 1 :(得分:1)

我认为这有助于您阅读有关计算机科学中threads的一般信息。

一个线程(在我看来)是一个异步的工作单元。您的处理器在程序中的不同线程之间跳转,以不同的时间间隔完成工作。您获得的好处是能够在一个线程上执行工作而另一个线程正在等待某些事情(如Thread.Sleep(0))。您还可以使用多个核心CPU,因为一个核心可以同时执行一个线程。

这能解释一些吗?

答案 2 :(得分:1)

这个想法是每个线程就像一个程序进程中包含的迷你进程。然后,操作系统将CPU执行时间分开。

对Sleep的调用加速了从一个线程到下一个线程的切换。如果没有它们,你可能看不到交织在一起的输出,但是你可能会再次看到 - 重点是当你创建一个执行多个线程的时候并不是由你决定 - 这就是你必须假设任何线程可能随时执行的原因并引导您进入锁定和同步的概念(我确信您将在下一个或很快遇到)。

答案 3 :(得分:0)

这似乎是正确的。一旦启动ThreadProc

t.Start();

它与主线程同时运行。因此系统将打印首先发生的任何打印语句。您将合并语句,因为两个循环同时进行。

答案 4 :(得分:0)

MSDNThread.Start()方法

  

使操作系统更改当前状态   实例到ThreadState.Running。   一旦线程处于ThreadState.Running状态,就会运行   系统可以安排它执行。

您提供的输出清楚地显示操作系统立即运行线程,然后在两个线程之间切换控制,尝试

t.Priority = ThreadPriority.Lowest;
t.Start();

并查看执行顺序是否已更改