2009-12-17 3 views

답변

27

아니요. C#은 Java와는 다르게 스레드를 처리합니다. Thread 클래스를 서브 클래스 화하는 대신 새로운 System.Threading.Thread 객체를 만들고 ThreadStart 델리게이트 (이 함수는 작업을 수행하는 함수)에 전달하면됩니다.

+5

사이드 노트 : Java에서'Runnable' 인터페이스는'Thread' 서브 클래스 화에 대한 대안이지만,'Runnable'을 생성자에 전달하면서 새로운'Thread' 오브젝트를 생성해야합니다. – Powerlord

+4

기본적으로 ThreadStart *는 Java Runnable과 동일한 C#입니다. –

+0

@Michel Borgwardt : 예, 대답은 정확하지만 (본질적으로) 잘못 작성된 것입니다. – OscarRyz

4

C#의 스레드는 필요하지 않습니다. 실행할 스레드의 실행 가능한 구성 요소 인 ThreadStart 또는 ParameterizedThreadStart 대리자의 인스턴스입니다.

3

.Net에서는 ThreadStartParameterizedThreadStart 대리자를 사용하여 스레드를 부트 스트랩합니다.

참석자는 .Net의 일급 시민이며, 필요할 경우 참조를 유지할 수 있습니다.

4

상위 수준의 작업 지향 스레딩 API에 가장 가까운 것이 BackgroundWorker입니다. 다른 사람들이 언급했듯이 .NET (및 C#)에서는 호출 가능 메서드를 나타내는 데 대리자를 사용합니다. 자바는 개념 (함수 포인터)을 가지고 있지 않으며, 대신 호출 가능한 객체를위한 인터페이스를 사용한다.

11

ThreadStart delegate은 본질적으로 Runnable 인터페이스와 동일합니다. 델리게이트는 전체 클래스가 아닌 단일 메소드의 인터페이스와 같으므로 Java에서 Runnable 인터페이스보다 구현하기가 실제로 쉽습니다.

MSDN explains about delegates는 :

은 대리인 및 인터페이스들은 규격 및 구현의 분리를 가능하게한다는 점에서 유사하다 . 복수의 독자적인 작성자는 인터페이스와 호환되는 구현을 생성 할 수 있습니다. 마찬가지로 대리자 은 메서드의 서명을 지정하고 및 작성자는 대리자 사양과 호환되는 메서드를 작성할 수 있습니다. 언제 인터페이스를 사용해야하며 언제 대표를 사용해야합니까?

  • 단일 메소드가 호출되고 :

    대리인 때 유용하다.

  • 클래스는 사양의 여러 구현을 원할 수 있습니다.
  • 정적 메서드를 사용하여 사양을 구현하는 것이 바람직합니다.
  • 이벤트와 유사한 디자인 패턴이 필요합니다 (자세한 내용은 이벤트 자습서 참조).
  • 호출자는 메서드가 정의 된 개체를 알거나 얻을 필요가 없습니다.
  • 구현 제공자는 구현을 몇 가지 선택 구성 요소로 "전달"하려고합니다.
  • 쉬운 구성이 요구됩니다.

    • 사양은 를 호출됩니다 관련 메소드 세트를 정의 할 때

    인터페이스 유용합니다.

  • 클래스는 일반적으로 한 번만 사양을 구현합니다.
  • 인터페이스 호출자가 다른 인터페이스 또는 클래스를 얻기 위해 인터페이스 유형으로 캐스팅하려는 경우.
6

C#ThreadStart 대리인이 대신 자바의 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(); 
    } 
} 
48

은 C#을 자바의 Runnable 인터페이스의 해당이 있습니까?

예, 그것은

class Runner 
{ 
    void SomeMethod() 
    { 
     Thread newThread = new Thread(new ThreadStart(Run)); 
     newThread.Start(); 
    } 

    public void Run() 
    { 
      Console.WriteLine("Running in a different thread.") 
    } 
} 

ThreadStart이 놀라운 반응을 대답 모든 사람에게

class Runner implements Runnable { 

    void someMethod() { 
     Thread newThread = new Thread(this); 
     newThread.start(); 
     } 

     public void run() { 
      out.println("Running in a different thread."); 
     } 
    } 
+0

2015-09-25 현재 Xamarin에 대해서는 아직 구현되지 않았으므로이 답변과 동일한 작업을 수행하기 위해 Frankenstein C#/Java 옵션이 필요합니다. – codeMonkey

관련 문제