线程如何相互通信?

时间:2010-08-13 15:38:51

标签: c# java .net-3.5

线程如何相互通信?他们不使用彼此的价值观,那么他们之间的沟通方式是什么?

3 个答案:

答案 0 :(得分:5)

线程可以通过几种方式相互通信。此列表并非详尽无遗,但确实包含了最常用的策略。

  • 共享内存,如变量或其他一些数据结构
  • 同步原语,如锁和sempahores
  • 活动,例如ManualResetEventAutoResetEvent

共享内存

public static void Main()
{
  string text = "Hello World";
  var thread = new Thread(
    () =>
    {
      Console.WriteLine(text); // variable read by worker thread
    });
  thread.Start();
  Console.WriteLine(text); // variable read by main thread
}

同步原语

public static void Main()
{
  var lockObj = new Object();
  int x = 0;
  var thread = new Thread(
    () =>
    {
      while (true)
      {
        lock (lockObj) // blocks until main thread releases the lock
        {
          x++;
        }
      }
    });
  thread.Start();
  while (true)
  {
    lock (lockObj) // blocks until worker thread releases the lock
    {
      x++;
      Console.WriteLine(x);
    }
  }
}

<强>事件

public static void Main()
{
  var are = new AutoResetEvent(false);
  var thread = new Thread(
    () =>
    {
      while (true)
      {
        Thread.Sleep(1000);
        are.Set(); // worker thread signals the event
      }
    });
  thread.Start();
  while (are.WaitOne()) // main thread waits for the event to be signaled
  {
    Console.WriteLine(DateTime.Now);
  }
}

答案 1 :(得分:4)

“他们不使用彼此的值” - 同一个进程中的两个线程可以看到常见变量,所以这就是简单的appraoch。所以我们使用各种同步,锁定,mutices和sempahore来等待条件并唤醒等待线程。

在Java中,您使用各种原语,例如同步。你可以阅读这个tutorial

答案 2 :(得分:1)

线程可以共享值,这样做时只需要小心。在.Net中,最常见的方法是lock语句和Interlocked类。