我是多线程的新手,但我不知道我的代码有什么问题:
public int k;
private void button2_Click(object sender, EventArgs e)
{
k = 10;
ThreadPool.SetMinThreads(2, 6);
ThreadPool.SetMaxThreads(2, 6);
ThreadPool.QueueUserWorkItem(aki);
ThreadPool.QueueUserWorkItem(aki);
}
public void aki(object ab)
{
do
{
this.SetText1(textBox1.Text +
" thread " + Thread.CurrentThread.GetHashCode() +
" valu= " + k + Environment.NewLine);
k--;
} while (k > 0);
if (k < 0) Thread.CurrentThread.Abort();
}
对于上述内容,我得到以下输出:
thread 11 valu= 10
thread 11 valu= 8
thread 11 valu= 6
thread 11 valu= 4
thread 11 valu= 2
thread 10 valu= 0
我期待10,9,8,7,6,5,4,3,2,1,0
的产出请指导我这有什么问题。
我试图一次运行两个线程。
怎么办?
编辑:在rohit的回答之后,我尝试了这个,但我得到了以下输出: thread 11 valu= 10
thread 12 valu= 9
thread 12 valu= 8
thread 11 valu= 7
thread 11 valu= 6
thread 6 valu= 7
thread 6 valu= 6
thread 6 valu= 5
thread 13 valu= 3
thread 14 valu= 2
thread 14 valu= 1
在这次运行中,7和6重复两次。
答案 0 :(得分:1)
这里的问题是两个线程都在同一个类的实例变量k
上工作。
因此,当值为one thread modifies
时,它为gets reflected in other thread
。
输出总是不确定的。就像我得到了这个输出 -
thread 18 valu= 10
thread 21 valu= 10
thread 18 valu= 9
thread 18 valu= 7
thread 18 valu= 6
thread 18 valu= 5
thread 18 valu= 4
thread 18 valu= 3
thread 18 valu= 2
thread 18 valu= 1
thread 21 valu= 8
您应该在aki
方法 -
public void aki(object ab)
{
int k = 10; // <---- HERE
do
{
this.SetText1(textBox1.Text +
" thread " + Thread.CurrentThread.GetHashCode() +
" valu= " + k + Environment.NewLine);
k--;
} while (k >= 0); // It should be less than and equal to 0 to print 0.
if (k < 0) Thread.CurrentThread.Abort();
}