2011-11-04 2 views
4

문제는 복잡하지만, 내가하고 싶은 것을 먹으 렴 :통화 방법

public class Main 
{ 
    MyClass instance = new MyClass(); 
    Thread secondThread = new Thread(instance); 

    public static void main() 
    { 
     secondThread.start(); 
     //here i want to call foo(), but be processed by secondThread thread(not the Main thread) 
    } 
} 


public class MyClass implements Runnable 
{ 
    @Override 
    public void run() 
    { 

    } 

    public void foo() 
    { 
     System.out.println("foo"); 
    } 
} 

을 내가 사용하는 경우 "instance.foo를();" 그것은 메인 스레드에 의해 처리됩니다.

+1

예, 나는 이미 그것에서 실행 해요 .. –

답변

4

Runnable의 아이디어는 선택한 컨텍스트 (이 경우 스레드) 내부의 다른 것으로 실행될 수있는 통합 된 코드 조각이라는 것입니다. 두 번째 스레드는 시작할 때 run() 메서드를 호출하므로 MyClass.run() 메서드 내에서 foo()에 대한 호출이 필요할 수 있습니다. 주 스레드에서 임의로 두 번째 스레드가 run() 메서드에서 수행중인 작업을 포기하고 foo()에서 작업을 시작한다는 것을 결정할 수 없습니다.

+0

는 "당신은 독단적으로 결정할 수없는, 메인 스레드에서, 두 번째 스레드가 지금은 run() 메소드에서는 시작하고 있었다 무엇이든 포기 위하여려고하고있다 foo() 작업. " "임의로 결정할 수 없다"는 말은 무슨 뜻인지 모르겠지만 주 메소드에서 foo를 실행하는 것은 가능합니다. run 메소드의 무한 루프는 run()입니다. 그래서, main 메소드가 'run()'을 호출하면 어떻게 될까요? 메인 프로세스의 스레드에서 실행되는 것입니까? –

+1

@DaleMarkowitz'main' 메쏘드가 직접'run'을 호출하면'main'이 실행되는 모든 스레드에서'run'이 실행될 것입니다. OP는 다른 스레드를 제어하고 그 실행을 직접적으로 가능하지 않은 다른 기능 (즉, 임의적으로 결정). –

3

스레드를 호출 할 수 없으며 신호 만 보낼 수 있습니다. foo()를 실행하려면 run()에 foo()를 실행하도록 요청해야한다는 신호를 보냅니다. 아래

+0

foo()가 예를 들어 다른 객체에 대한 참조를 반환하고이를 예제에서와 같이 호출하면 foo()가 반환하는 값은 무엇이겠습니까? –

1

변화 코드 :

public class Main 
{ 
    Object signal = new Object(); 
    MyClass instance = new MyClass(); 
    Thread secondThread = new Thread(instance); 

    public static void main() 
    { 
     instance.setSignal(signal); 
     secondThread.start(); 
      synchronize(signal) 
      { 
     try{ 
      signal.notify();**//here will notify the secondThread to invoke the foo()** 
     } 
     catch(InterrupedException e) 
     { 
       e.printStackTrace(); 
      } 
    } 
} 


public class MyClass implements Runnable 
{ 
    Object signal; 
    public setSignal(Object sig) 
    { 
     signal = sig; 
    } 

    @Override 
    public void run() 
    { 
     synchronize(signal) 
     { 
     try{ 
      signal.wait(); 
     } 
     catch(InterrupedException e) 
     { 
       e.printStackTrace(); 
      } 
     } 
     this.foo(); 

    } 

    public void foo() 
    { 
     System.out.println("foo"); 
    } 
} 
1

은 내가 집행자를 포함하는 클래스를 수정 한 다음 그 방법이 작업을 실행하는 실행자에게있어이 것입니다. Executor를 MyClass의 생성자에 전달하면 main은 작업이 어떻게 실행되는지 제어합니다.

public class Main 
{ 
    Executor runner = Executors.newSingleThreadExecutor(); 
    MyClass instance = new MyClass(runner); 

    public static void main() 
    { 
     instance.foo(); 
     // cleanup executor 
    } 
} 


public class MyClass 
{ 
    private final Executor runner; 

    public MyClass(Executor runner) 
    { 
     this.runner = runner; 
    } 

    public void foo() 
    { 
     runner.execute(new Runnable() { 
      public void run() { 
      System.out.println("foo"); 
      } 
     }); 
    } 
}