1

看这里:

static void Main(string[] args)
{
    test p = new test();

    new Thread(() => p.SayHello("Thread One")).Start();
    new Thread(() => p.SayHello("Thread Two")).Start();
}

然后:

class test
{
    public void SayHello(string data)
    {
        int i = 0;

        while (i < 50)
        {
            Console.WriteLine("Hello from " + data);
            i++;
        }
    }
}

为什么第二个线程不将变量重置i为 0?并弄乱它在第一个线程上运行的while循环?

4

3 回答 3

5

这是因为int i是一个局部变量。如果您将其设置为类的静态变量,而不是局部变量,它将被重置。在这种情况下,变量与每个线程隔离。

例子:

static void Main(string[] args)
{
    test p = new test();

    new Thread(() => p.SayHello("Thread One")).Start();
    new Thread(() => p.SayHello("Thread Two")).Start();
}

public class test
{
    static int i = 0;
    public static void SayHello(string data)
    {
        i = 0;

        while (i < 50)
        {
            Console.WriteLine("Hello from " + data);
            i++;
        }
    }
}
于 2013-10-15T21:27:23.463 回答
5

i是一个局部变量,因此每个线程都有自己的i.

于 2013-10-15T21:27:45.223 回答
0

把它想象成每个线程都获得了它自己的 SayHello 方法的“副本”和它的局部变量。如果您希望两个线程使用相同的 i,则必须通过引用传递它,然后有趣的事情就开始了。

于 2013-10-15T21:32:38.767 回答