2015-11-07 90 views
6

我是C#的新手,仍在学习线程概念。我写了一个程序,它是如下C语言中的线程概念#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 

namespace ConsoleApplication17 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     System.Threading.ThreadStart th1 = new System.Threading.ThreadStart(prnt); 
     Thread th = new Thread(th1); 
     th.Start(); 
     bool t = th.IsAlive; 
     for (int i = 0; i < 10; i++) 
     { 
      Console.WriteLine(i + "A"); 
     } 
    } 

    private static void prnt() 
    { 
     for (int i = 0; i < 10; i ++) 
     { 
      Console.WriteLine(i + "B"); 
     } 
    } 
    } 
} 

我期待的输出,如: -

1A 
2A 
1B 
3A 
2B... 

,因为我相信,这两个主线程和新创建的线程应该同时执行。

但是输出是有序的,首先调用prnt函数,然后执行循环的Main方法。

+3

你的代码看起来罚款;大概它只是需要更长的时间才能完成主线程。为每个'for for循环添加'Thread.Sleep(500);';这将有助于确保他们花费更长时间运行,以便您可以看到发生了什么。 – JohnLBevan

+1

线程调度是不可预测的,许多程序都会失败(比赛条件),因为程序员假定线程不存在某些理想行为,例如假设线程始终并行运行并处于完美同步状态。他们不。考虑您的程序如何在带有大型(100ms +)时间片的操作系统的单线程处理器上运行。 – Dai

回答

3

可能的10 cicle是不够的,看到两个线程同时运行。 使用更长的循环或在循环迭代中放置Thread.Sleep(100)。 启动线程非常昂贵。它会发生什么,也许是你主回路得到螺纹循环开始之前执行,由于一个线程需要的时间来启动

+0

谢谢,它有100次迭代。 – user2235487

2

我和你需要添加的Thread.Sleep以前的答案同意(一些秒* 1000)

我建议你阅读这篇文章关于线程 https://msdn.microsoft.com/ru-ru/library/system.threading.thread(v=vs.110).aspx

static void Main(string[] args) 
    { 
     Thread th = new Thread(prnt); 
     th.Start(); 
     for (int i = 0; i < 10; i++) 
     { 
      //sleep one second 
      Thread.Sleep(1000); 
      Console.WriteLine(i + "A"); 
     } 
     //join the basic thread and 'th' thread 
     th.Join(); 
    } 
    private static void prnt() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      //sleep one second 
      Thread.Sleep(1000); 
      Console.WriteLine(i + "B"); 
     } 
    } 
1

更新:一个进程被用来隔离应用程序和线程在该进程的上下文中运行。

通过这种方式,它使得更容易为OS管理的应用程序不同,管理崩溃和上下文切换(所提供的每个应用程序由CPU执行的时间时隙)。后面的想法是在预定时间段内简单地运行线程,当允许应用程序运行的时间结束时,CPU切换到其他线程执行。

在应用程序中为小型异步任务使用Threading类。

了解如何在下面的例子中,你可以使用System.Threading命名空间创建一个新的线程。注意如何调用t.Join()以等待新线程完成。

注意,Spleep(1)将迫使改变的背景下,这就是是什么使你例子的区别。尝试将其更改回零并查看结果。

using System; 
using System.Threading; 

namespace Chapter1 
{ 
    public static class Threads1 
    { 
     public static void ThreadMethod() 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       Console.WriteLine("ThreadProc: {0}", i); 
       Thread.Sleep(1); 
      } 
     } 
     public static void Main(string[] args) 
     { 
      Thread t = new Thread(new ThreadStart(ThreadMethod)); 
      t.Start(); 
      for (int i = 0; i < 4; i++) 
      { 
       Console.WriteLine("Main thread: Do some work."); 
       Thread.Sleep(1); 
      } 
      t.Join(); 

      Console.Read(); 
     } 
    } 
} 
// OUTPUT: 
//Main thread: Do some work. 
//ThreadProc: 0 
//ThreadProc: 1 
//Main thread: Do some work. 
//ThreadProc: 2 
//Main thread: Do some work. 
//ThreadProc: 3 
//Main thread: Do some work. 
//ThreadProc: 4 
//ThreadProc: 5 
//ThreadProc: 6 
//ThreadProc: 7 
//ThreadProc: 8 
//ThreadProc: 9 
+1

*“线程”用于隔离应用程序并让它们在自己的进程中运行。*不,线程不是一个进程,也不会隔离“应用程序”。线程是一个执行单元,允许多个工作*并行*完成。线程仍处于进程的逻辑上下文中。 –

+0

已更新@YuvalItzchakov – Rober