C#创建公共实例
我的问题是为什么这行 - ThreadTest tt = new ThreadTest();
在下面的例子中创建一个公共实例,而不是一个单独的实例。请指教,谢谢!C#创建公共实例
class ThreadTest
{
bool done;
static void Main()
{
ThreadTest tt = new ThreadTest(); // Create a common instance
new Thread (tt.Go).Start();
tt.Go();
}
// Note that Go is now an instance method
void Go()
{
if (!done) { done = true; Console.WriteLine ("Done"); }
}
}
编辑: 的示例是从http://www.albahari.com/threading/#_Introduction,其演示了如何线程之间共享数据。
EDIT2: 我的问题就是为什么“的实例是常见的两种线程”
目前还不清楚你所说的“共同实例”的意思,但构造绝对创建一个新的实例。 Go
方法执行两次,一次在新线程中,一次在主线程中执行。
也许什么代码作者的意思是,实例是常见的两个线程,因为两个线程调用同一实例Go
方法。
Go
方法的内部存在竞争条件。它可能无法预料地打印两次“完成”。
如果您的意思是这两个调用tt.Go
共享'完成'变量,那当然会发生。你在同一个对象上调用一个方法,只是在主线程中发生,而另一个发生在单独的线程中。
你永远只能创建ThreadTest的一个实例,但叫去了两次,所以两个调用具有相同的对象上发生!
6年后,我在这里,因为我读了这本书的同一部分。在你刚刚提到的那本书之前的书中的例子显示了(静态的).Go在一个匿名的新线程上执行,然后在本地上下文中单独执行。
new Thread (Go).Start();
Go();
的例子在你的问题首先创建TT的实例,也从一个静态方法实例方法改变。去。
ThreadTest tt = new ThreadTest();
new Thread (tt.Go).Start();
tt.Go();
所以现在。去的时候被送到执行新的线程,结果收到了送什么方法TT的拷贝(而不是静态的。去的方法),这也是得到了什么之后立即在本地执行因为.Go的两个执行都属于tt,所以他们也使用tt的副本done
。 Afaik,这就是为什么作者将这个数据称为“通用”,因为它现在可以被两个线程访问。另外:我仍然在自己的几个方面摇摆不定。我的一个谜团是什么时候执行new Thread (tt.Go).Start();
...... tt是在初始线程中实例化的,但它现在同时存在于两者中? byref/byval在这里适用还是其他事情正在进行?是否更准确地说,tt对象实际上不是“活着”或“属于”任何线程,而是堆,因此两个线程都应该可以访问它?
对于程序员来说,对象所有权对于技术来说更为合理。该对象存在(生命)在堆上,没有“所有者”。它是共享的,因为在向新线程传递'tt.Go'时,它会捕获'tt'实例,所以新线程引用'tt'确保它保持活动状态;主线程也有对'tt'的引用。实际上,这提供了共享数据。对象在任何引用存在时都会存活 - 哪个线程或哪个线程无关紧要。 – MicroVirus 2016-06-11 00:46:25
什么是'ThreadTest'?我在框架中找不到这样的类。 – Bobby 2010-08-30 09:53:18
@Bobby:嗯,问题中的代码声明了它。 – Timwi 2010-08-30 09:54:09
@Timwi:Doh,我是个白痴。 – Bobby 2010-08-30 09:56:51