using System;
using System.Threading;public class CH3_3
{
Thread[] threads;
int whichThread;
int runCount;
public void CheckThread()
{
lock(this)
{
runCount++;
Console.WriteLine("Run Count {0}",runCount);
if(runCount > 4)
{
Console.WriteLine("Which Thread {0}",whichThread);
threads[whichThread].Abort();
runCount = 0;
whichThread++;
}
}
}
public void RunThread()
{
Boolean done = false;
while(!done)
{
CheckThread();
}
}
public void StartThreads()
{
threads = new Thread[3];
runCount = 0;
whichThread = 0;
for(int i =0; i<3; ++i)
{
threads[i] = new Thread(new ThreadStart(RunThread));
threads[i].Start();
}
}
public static void Main()
{
CH3_3 app = new CH3_3();
app.StartThreads();
}
}运行结果是这样的:RunCount怎么到6的?
using System.Threading;public class CH3_3
{
Thread[] threads;
int whichThread;
int runCount;
public void CheckThread()
{
lock(this)
{
runCount++;
Console.WriteLine("Run Count {0}",runCount);
if(runCount > 4)
{
Console.WriteLine("Which Thread {0}",whichThread);
threads[whichThread].Abort();
runCount = 0;
whichThread++;
}
}
}
public void RunThread()
{
Boolean done = false;
while(!done)
{
CheckThread();
}
}
public void StartThreads()
{
threads = new Thread[3];
runCount = 0;
whichThread = 0;
for(int i =0; i<3; ++i)
{
threads[i] = new Thread(new ThreadStart(RunThread));
threads[i].Start();
}
}
public static void Main()
{
CH3_3 app = new CH3_3();
app.StartThreads();
}
}运行结果是这样的:RunCount怎么到6的?
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 0
Run Count 6
Which Thread 0
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 1
Run Count 6
Which Thread 1
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 2
Press any key to continue
if(runCount > 4) runCount 退出循环
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 0
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 1
Run Count 1
Run Count 2
Run Count 3
Run Count 4
Run Count 5
Which Thread 2
Press any key to continue
threads[whichThread].Abort();
runCount = 0;
whichThread++;你仔细想想,后两句是否能被保证执行?
改成这样,大概可以得到你想要的结果。
runCount = 0;
whichThread++;
Thread.CurrentThread.Abort();
runCount = 0;
whichThread++;
出现6的原因可以能是
你在生成3个线程的时候的···你开始生成的线程运行过不只1次·可能是1,2,3,4.。。次·····
你Count是全局的··所以就肯定不值3··· public void CheckThread()
{
lock(this)
{
runCount++;
Console.WriteLine("Run Count {0}",runCount);
if(runCount > 4)
{
Console.WriteLine("Which Thread {0}",whichThread);
threads[whichThread].Abort();
runCount = 0;
whichThread++;
}
}
}改为: public void CheckThread()
{
Monitor.Enter(this);
{
runCount++;
Console.WriteLine("Run Count {0}",runCount);
if(runCount > 4)
{
Console.WriteLine("Which Thread {0}",whichThread);
threads[whichThread].Abort();
runCount = 0;
whichThread++;
}
}
}
{
CH3_3 app = new CH3_3();
app.StartThreads();
Monitor.Enter(app);
}建议一般不要lock(this)