C# 线程如何相互通信?
线程如何相互通信?他们彼此不使用价值观,那么他们之间的沟通方式是什么呢?线程可以共享价值观,但在这样做时必须小心。在.Net中,最常用的方法是C# 线程如何相互通信?,c#,java,.net-3.5,C#,Java,.net 3.5,线程如何相互通信?他们彼此不使用价值观,那么他们之间的沟通方式是什么呢?线程可以共享价值观,但在这样做时必须小心。在.Net中,最常用的方法是lock语句和联锁类 “它们不使用彼此的值”-同一进程中的两个线程可以看到公共变量,因此这就是simples方法。因此,我们使用各种同步、锁定、mutices和sempahores来等待条件并唤醒等待的线程 在Java中,您使用各种原语,例如同步。您可以阅读此线程之间有几种通信方式。该列表并非详尽无遗,但确实包含了最常用的策略 共享内存,如变量或其他数据
lock
语句和联锁类 “它们不使用彼此的值”-同一进程中的两个线程可以看到公共变量,因此这就是simples方法。因此,我们使用各种同步、锁定、mutices和sempahores来等待条件并唤醒等待的线程
在Java中,您使用各种原语,例如同步。您可以阅读此线程之间有几种通信方式。该列表并非详尽无遗,但确实包含了最常用的策略
- 共享内存,如变量或其他数据结构
- 同步原语,如锁和符号
- 事件,如
或ManualResetEvent
AutoResetEvent
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);
}
}
事件
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);
}
}
除了已经给出的答案外,在这里查看一本免费电子书,该书对C#中线程的工作原理进行了相当深入的介绍: