C#启动一个线程数组[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#启动一个线程数组[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

要了解如何启动调用相同方法的多个线程,我想使用以下逻辑:

  • 创建一个线程数组
  • 使用lambda表达式初始化线程
  • 启动线程。

如果我使用Join函数或直接启动线程,例程可以正常工作:

new Thread(EnterSemaphore).Start(i);

我从结果中看到的是我正在使用的例程不起作用。并非所有线程都显示,我甚至看到索引号为6的线程。我想了解为什么启动这样的线程数组会失败。

class SemaphoreLock
{

    #region Fields
    // SemaphoreSlim _sem heeft de capaciteit voor 3 elementen 
    static SemaphoreSlim _sem = new SemaphoreSlim(3); // Capacity of 3

    public readonly object StartLocker = new object();

    #endregion

    #region Constructor
    // 
    public SemaphoreLock()
    {
        Thread[] testStart = new Thread[10];

        for (int i = 1; i <= 5; i++)
        {

            // If enabled, this works
            // new Thread(EnterSemaphore).Start(i);

            // This is not working.
            testStart[i] = new Thread(() => EnterSemaphore(i));
            lock (StartLocker) testStart[i].Start();

            // Adding a join here works, every thread is started as a single thread
            //testStart[i].Join();
        }

    }
    #endregion


    #region Methods
    static void EnterSemaphore(object id)
    {
        Console.WriteLine(id + " wants to enter");

        // Block the current thread until it can enter the Semaphore
        _sem.Wait();

        Console.WriteLine(id + " is in!");
        Thread.Sleep(1000 * (int)id);
        Console.WriteLine(id + " is leaving");
        _sem.Release();

        if (_sem.CurrentCount == 3)
        {

            Console.WriteLine("Done...");
        }
    }

       #endregion

}
答案

你的代码运行正常。使用线程Join你只能看到不同的线程,因为Thread.Join

阻止调用线程,直到此实例表示的线程终止,同时继续执行标准COM和SendMessage抽取。

作为另一个例子,你也可以使用Thread.Sleep()查看类似的行为:

        testStart[i] = new Thread(() => EnterSemaphore(i));
        lock (StartLocker) testStart[i].Start();
        Thread.Sleep(100);

更好的是,为了见证行为,在for循环结束时使用ReadLine()

 for (int i = 1; i <= 5; i++)
 {      
   testStart[i] = new Thread(() => EnterSemaphore(i));
   lock (StartLocker) testStart[i].Start();
 }
 Console.ReadLine();

以上是关于C#启动一个线程数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

在片段中启动 Activity [重复]

如何创建片段以重复变量编号中的代码行

java线程只能被启动(Thread.start())一次,那么为啥线程池中的线程能被重复利用呢?

JAVA开启三个线程,去读取数组中的数据不能重复

在c ++中使用线程进行Shell排序[重复]