原範例中計數器啟動於 run() 方法,若某執行緒排程延遲未執行,主執行緒可能誤判全部完成。解法:將初始化移至建構函式,執行緒建立即執行,移除 lock:
public ThreadCounter(int ms) {
this.ms = ms;
Increment(); // 建構時立即執行
}

private static void ThreadMethod(object obj) {
Thread.Sleep((int)obj);
Console.WriteLine(obj + " ms 任務結束");
}
private static void JoinAll(object obj) {
foreach (Thread t in (Thread[])obj) t.Join();
Console.WriteLine("所有執行緒結束");
}
static void Main() {
Thread t1 = new Thread(ThreadMethod);
Thread t2 = new Thread(ThreadMethod);
Thread t3 = new Thread(ThreadMethod);
t1.Start(3000); t2.Start(5000); t3.Start(7000);
new Thread(JoinAll).Start(new Thread[] { t1, t2, t3 });
}
兩種寫法均無執行緒數量限制(受 OS/硬體資源約束),Join 方式更通用、不需共享計數器。