none
有关多线程调用的实例的一个问题 RRS feed

  • 问题

  • 有如下程序:
    class testClass
    {
    public void polling()
     {
       myThread[] = new Thread[5];
      for (int i=0;i<5;i++)
      {
       myThread[i]=new Thread(new ParameterizedThreadStart(testFunction1(obj)));
       myThread[i].start(obj);
      }
     }

    private void testFunction1(object obj)
    {
    ...........................
    }
    }

    class testClass2
    {
    testClass cls = new testClass;
    cls.polling();
    }

    请问当在执行 cls.polling();这句代码的时候,多线程是如何 调用执行的。
    说法1: 多线程myThread[0]....myThread[4]在执行的时候是 调用的一个实例的testFunction1方法执行的。
    说法2: 多线程myThread[0]....myThread[4]在执行的时候是 调用的5个不同实例的testFunction1方法执行的。
    说法3: 多线程myThread[0]....myThread[4]在执行的时候由于在执行的时候由于调用的是自己类内部的方法,不存在调用类实例的问题。
    还是以上说法都不对,而是......

    2010年3月8日 7:51

答案

  • 你好!
         描述的都不是很准确,勉强来说的话,说法1比较接近,准确的说法是这四个线程都是在同一个实例cls上调用的方法testFunction1,如果方法testFunction1种对某些字段做了修改,也是修改cls这个实例的中的某些字段!
         希望这个解释对你有帮助!
    周雪峰
    • 已标记为答案 scoket.joe 2010年3月10日 2:12
    2010年3月8日 8:53
    版主

全部回复

  • 你好!
         描述的都不是很准确,勉强来说的话,说法1比较接近,准确的说法是这四个线程都是在同一个实例cls上调用的方法testFunction1,如果方法testFunction1种对某些字段做了修改,也是修改cls这个实例的中的某些字段!
         希望这个解释对你有帮助!
    周雪峰
    • 已标记为答案 scoket.joe 2010年3月10日 2:12
    2010年3月8日 8:53
    版主
  • 你好
    “如果方法testFunction1种对某些字段做了修改,也是修改cls这个实例的中的某些字段!”这句话不理解,请在解释一下,假如这个testFunction1 执行的是数据库修改的动作,那么也就是说每个线程都在更新DB,那么在这种情况下,它是怎么样一种情况呢。
    2010年3月9日 1:42
  • 你好!
         是这个意思:
    class testClass
    {
     private string name="";    //这里定义一个字段
    public void polling()
     {
       myThread[] = new Thread[5];
      for (int i=0;i<5;i++)
      {
       myThread[i]=new Thread(new ParameterizedThreadStart(testFunction1(obj)));
       myThread[i].start(obj);
      }
     } private void testFunction1(object obj)
    {
         name="abc";     //这里修改了字段abc的值,修改的是cls这个实例的name字段
    }

    数据库的更新,你最好在程序中考虑冲突的问题,可以考虑加锁等同步机制!
    周雪峰
    2010年3月9日 2:10
    版主