namespace WindowsFormsApplication2
{
    class Class1
    {
        public volatile bool shouldStop;
        private Form1 form;
        public Class1(Form1 form)
        {
            this.form = form;
        }
        public void Method1(object obj)
        {
            string s = obj as string;
            form.AddMessage(s);
            while (shouldStop == false)
            {
                Thread.Sleep(1000);//将当前线程阻塞,线程1休眠100毫秒
                form.AddMessage("a");            }
            form.AddMessage("\n线程Method1已经终止");
        }
        public void Method2(object obj)
        {            
            while (shouldStop == false)
            {
                Thread.Sleep(1000);//将当前线程阻塞,线程2休眠100毫秒
                form.AddMessage("b");            }
            form.AddMessage("\n线程Method2已经终止");
        }
    }
}namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Thread thread1, thread2;
        Class1 cls;
        public Form1()
        {
            InitializeComponent();
            cls = new Class1(this);        }        private void btnStart_Click(object sender, EventArgs e)
        {            richTextBox1.Clear();
            cls.shouldStop = false;
            thread1 = new Thread(cls.Method1);
            thread1.IsBackground = true;
            thread2 = new Thread(cls.Method2);
            thread2.IsBackground = true;
            thread1.Start("a method start\n");
            thread2.Start();
        }        private delegate void AddMessageDelegate(string message);
        public void AddMessage(string s)
        {
            if (richTextBox1.InvokeRequired == true)
            {
                AddMessageDelegate d = AddMessage;
                richTextBox1.Invoke(d, s);
            }
            else
            {
                richTextBox1.AppendText(s);
            }
        }        private void btnStop_Click(object sender, EventArgs e)
        {
            cls.shouldStop = true;            thread2.Join(2000); //总是先是线程2结束,然后线程1结束
            thread1.Join(5000);
            /*
             * thread1.Join(0);//问题1:总是先是线程2结束,然后线程1结束,为什么?
             * thread2.Join(0); //问题2:看了参数表是时间,这里参数为0是表示 立即么?和无参数有什么区别?
             */
        }
    }
}

解决方案 »

  1.   

    好像 shouldStop 一直为true把,这样的话,两个线程是死循环,然后第二个等待2000后返回,第一个5000返回,应该是2先回啊,你看join返回的应该是false,线程并未结束
      

  2.   


    我改成: thread2.Join(5000); 
    thread1.Join(2000);输出结果:
    a method start
    bababa
    线程Method2已经终止
    线程Method1已经终止
      

  3.   

    谢谢。总结一下。
    问题1,是我理解错了,因为当时在调试的时候发现总是线程2先结束,然后线程1结束,换了一台电脑转换,发现原来是随机的,不是固定的。所以,应该是不存在线程2一定先于线程1结束的。
    问题2,是说,如果Trhead1.Join(0)的话就是执行Thread1结束后交出剩余时间片?我试了一下如果不加参数就是主线程无反应了。