как потоки общаются друг с другом? они не используют значения друг друга, затем каков способ коммуникации между ними?
Существует несколько способов взаимодействия потоков друг с другом. Этот список не является исчерпывающим, но в него включены наиболее часто используемые стратегии.
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);
}
}
«они не используют значения друг друга» - ну, два потока в одном процессе могут видеть общие переменные, так что это простая оценка. Итак, мы используем различные синхронизацию, блокировку, мутации и семпахоры для ожидания условий и пробуждения ожидающих потоков.
В Java вы используете различные примитивы, такие как синхронизация. Вы можете прочитать это руководство
Потоки могут обмениваться значениями, им просто нужно быть осторожными при этом. В .Net наиболее распространенными методами являются оператор lock
и класс Interlocked.