线程化:c#是否具有Java Runnable接口的等价物?

时间:2009-12-17 17:58:59

标签: c# java interface multithreading

c#是否具有Java Runnable接口的等价物?

如果不能实现,或者根本不需要它?

感谢。

7 个答案:

答案 0 :(得分:53)

  

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.");
      }
  }

答案 1 :(得分:28)

不。 C#以不同于Java的方式处理线程。您只需创建一个新的System.Threading.Thread对象并将其传递给ThreadStart委托(这是您执行工作的函数)而不是继承Thread类,而不是继承Thread类。

答案 2 :(得分:14)

ThreadStart delegateRunnable接口基本相同。委托就像是单个方法而不是整个类的接口,因此它实际上比Java中的Runnable接口更容易实现。

MSDN explains about delegates

  

代理和接口类似   因为他们能够分离   规范和实施。   多位独立作者可以   产生实现   兼容接口   规格。同样,代表   指定方法的签名,   作者可以编写方法   与代表兼容   规格。你应该什么时候使用   接口,何时使用   代表?

     

代表在以下情况下非常有用:

     
      
  • 正在调用一种方法。
  •   
  • 类可能希望具有该方法的多个实现   说明书
  •   
  • 希望允许使用静态方法来实现   说明书
  •   
  • 需要类似事件的设计模式(有关更多信息,请参阅   活动教程)。
  •   
  • 调用者无需知道或获取该方法的对象   定义于。
  •   
  • 实施的提供者想要“分发”   规范的实施   只有少数选择组件。
  •   
  • 需要简单的组合。
  •   
     

接口在以下情况下非常有用:

     
      
  • 规范定义了一组相关的方法   调用。
  •   
  • 类通常只实现一次规范。
  •   
  • 接口的调用者想要转换为接口或从接口转换   键入以获取其他接口或   类。
  •   

答案 3 :(得分:6)

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();
    }
}

答案 4 :(得分:4)

不需要 - C#中的线程采用ThreadStartParameterizedThreadStart委托的实例,它们是要执行的线程的可运行组件。

答案 5 :(得分:4)

最接近高级面向任务的线程API将是BackgroundWorker。正如其他人所提到的,.NET(以及C#)使用委托来表示可调用方法。 Java没有那个概念(函数指针),而是使用可调用对象的接口。

答案 6 :(得分:3)

.Net使用ThreadStartParameterizedThreadStart委托来引导线程。

代表作为.Net的一等公民,如果需要,你可以随时提供参考。