【发布时间】:2017-12-04 03:44:20
【问题描述】:
我制作了一个使用两个线程计算数字的小示例程序。它还会在计数旁边打印第二个数字,这样我就可以看到哪个线程打印了哪个数字。
现在我的目标是让两个线程在其中一个数为 7 后立即停止。我不知道该怎么做。我考虑过将线程数组作为参数传递给Counter,然后使用 foreach 循环中止两个线程。问题是t0 可能正在执行它并调用t0.Abort(),因此t1.Abort() 将不再被调用。
public static int count = 0;
private static object lockObject = new object();
static void Main(string[] args) {
Thread t0 = new Thread(() => Counter(1, 10));
Thread t1 = new Thread(() => Counter(10, 20));
t0.Start();
t1.Start();
t0.Join();
t1.Join();
Console.ReadLine();
}
public static void Counter(int k, int m) {
for(int i = k; i < m; i++) {
lock (lockObject) {
count++;
Console.WriteLine(count + " " + i);
if (i == 7) {
/*
* Code that will kill thread t0 and t1
*/
}
}
}
}
输出应该是这样的
1 1
2 2
3 10
4 11
5 12
6 13
7 14
有人建议如何杀死t0 和t1?
【问题讨论】:
-
您愿意使用
Tasks 代替普通的线程吗?如果是这样,有一种简单的方法可以等到第一个在主线程中完成,然后您可以终止所有这些。 -
您的目标是两个线程都不应该打印大于 14 的数字,对吧?而且计数永远不会减少,对吗?为什么不让每个线程在看到 count > 14 时杀死 自身(即返回)?
-
CancellationTokenSource是你的朋友。 -
不,我的目标是线程数到7时立即停止。第二个数字只是为了查看它来自哪个线程。
标签: c# multithreading