是否可以继承Thread类并重写Start方法?
是否可以继承Thread类并重写Start方法?
为什么有人会想要这样做呢:很多语言(例如Java)和/或线程API(例如Qt)允许开发者通过继承“线程”基类并重载实现线程例程的方法来实现线程。
在Qt中广泛使用这种模型后,我发现它非常方便——整个线程都包含在一个对象内,而不是将线程指向某个函数或方法,这通常会导致奇怪和/或复杂的代码。
这里是使用Qt API的示例代码:
class MyThread : public QThread
{
Q_OBJECT
protected:
void run();
};
void MyThread::run()
{
...something I need threaded...
}
QThread是Qt的线程基类。要使用MyThread,请创建线程对象的实例并调用QThread :: start()。然后,运行run()的重新实现中的代码将在一个单独的线程中执行。
这个方法的好处是它让你可以将线程所需的所有内容都包含在一个对象中,并且(根据我的经验),它可以形成一个非常连贯的对象模型。我认为它并不能满足每个人的需求,但是说实话,我有点惊讶C#没有这样一个基本的线程模型。
我绝对不相信C#的Thread类因为内核复杂性而被封闭;如果Qt可以提供一个允许继承QThread的跨平台线程库,我认为微软也可以通过在C#中提供类似功能的线程类来实现相同的能力。
using System.Threading;
namespace NGrubb.Threading {
public abstract class BaseThread {
private Thread m_thread;
public BaseThread() {
m_thread = new Thread( Run );
}
public void Start() {
m_thread.Start();
}
protected abstract void Run();
}
}
不,Thread
类是sealed
的。这个决定背后的理由是:Thread
类是对内核对象的一个棘手且低级别的包装器,所以你不应该去动它。
不过我有一个问题,你为什么想要重写Start方法?你想要实现什么?
我认为没有任何一种继承能够产生比这更易读的代码:
Thread myThread = new Thread(() =>
{
//Do what you want...
});
myThread.Start();
不确定为什么您可能想要这样做(即使可以这样做,也不应该这样做),但有一种方法可以规避Thread
类被密封的事实-使用扩展方法。更技术性地说,它只是向Start
方法组添加一个重载(而不是覆盖),但在您的上下文中仍可能有所帮助。
像这样的东西可能是您想要的:
public static void Start(this Thread thread, int foo)
{
// Your code here.
thread.Start();
}
var thread = new Thread();
thread.Start(123);
不...
Thread类是一个密封的类,它代表了在操作系统中运行的线程。
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread
谢谢
我也习惯在Java应用程序中使用相同的逻辑,将线程捆绑到对象中,进一步将新进程的启动与其父进程分离是非常有意义的。同样地,很失望C#不支持这种方法。 Dave P
这是一个密封类,意味着你无法从它继承。