【发布时间】:2009-12-17 17:58:59
【问题描述】:
c# 是否有与 Java Runnable 接口等效的接口?
如果不是,如何实现或者根本不需要?
谢谢。
【问题讨论】:
-
非常感谢所有回答这个惊人回复的人。
标签: c# java interface multithreading
c# 是否有与 Java Runnable 接口等效的接口?
如果不是,如何实现或者根本不需要?
谢谢。
【问题讨论】:
标签: c# java interface multithreading
c# 是否有等效的 Java Runnable 接口?
是的,是ThreadStart
class Runner
{
void SomeMethod()
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
}
public void Run()
{
Console.WriteLine("Running in a different thread.")
}
}
相当于下面的Java代码
class Runner implements Runnable {
void someMethod() {
Thread newThread = new Thread( this );
newThread.start();
}
public void run() {
out.println("Running in a different thread.");
}
}
【讨论】:
ThreadStart delegate 与Runnable 接口基本相同。委托类似于单个方法而不是整个类的接口,因此它实际上比 Java 中的Runnable 接口更容易实现。
委托和接口是相似的 因为它们能够分离 规范和实施。 多个独立作者可以 产生的实现是 与接口兼容 规格。同样,委托 指定方法的签名, 并且作者可以编写方法 与代表兼容 规格。你应该什么时候使用 接口,什么时候应该使用 代表?
代表在以下情况下很有用:
- 正在调用一个方法。
- 一个类可能需要方法的多个实现 规范。
- 最好允许使用静态方法来实现 规范。
- 需要类似事件的设计模式(有关详细信息,请参阅 活动教程)。
- 调用者无需知道或获取该方法的对象 定义于。
- 实现的提供者想要“分发” 规范的实施 只有少数选定的组件。
- 需要简单的构图。
接口在以下情况下很有用:
- 规范定义了一组相关的方法 调用。
- 一个类通常只实现一次规范。
- 接口的调用者想要转换到接口或从接口转换 键入以获取其他接口或 类。
【讨论】:
不。 C# 处理线程的方式与 Java 不同。您无需继承 Thread 类,只需创建一个新的 System.Threading.Thread 对象并将其传递给 ThreadStart 委托(这是您执行工作的函数)..
【讨论】:
Runnable 接口是子类化Thread 的替代方法,但您仍然必须创建一个新的Thread 对象,将Runnable 传递给构造函数。
C# 使用 ThreadStart 委托而不是 Java 的 Runnable 样式。
public class Foo
{
public void DoStuff()
{
while (true)
{
// do some stuff
}
}
};
public class Bar
{
public static int Main()
{
Foo foo = new Foo();
// create a ThreadStart delegate and pass in the method that will run
// (similar to run on Java's Runnable)
Thread thread = new Thread(new ThreadStart(foo.DoStuff));
thread.Start();
}
}
【讨论】:
这不是必需的 - C# 中的线程采用 ThreadStart 或 ParameterizedThreadStart 委托的实例,它们是要执行的线程的可运行组件。
【讨论】:
最接近高级面向任务的线程 API 是BackgroundWorker。正如其他人所提到的,.NET(以及 C#)使用委托来表示可调用的方法。 Java 没有这个概念(函数指针),而是使用可调用对象的接口。
【讨论】:
.Net 使用 ThreadStart 和 ParameterizedThreadStart 委托来引导线程。
代表是 .Net 中的一等公民,如果需要,您可以保留参考。
【讨论】: