2013-07-30 3 views
1

나는 모드가 Runnable 인터페이스를 구현하는 클래스를 가지고 있습니다.스레드없이 Runnable을 구현하는 Java 클래스

이제 부울에 따라 프로그램에서 멀티 스레드 또는 비 멀티 쓰레드 (순차) 클래스를 시작하려고합니다.

어떻게해야할까요?

Constructor<?> constructor = processorClass.getConstructor(constructorParameterTypes); 
Processor<T> process = (Processor<T>)constructor.newInstance(constructorParameters); 
RunnableProcessor<T> runnableProcessor = new RunnableProcessor<>(process, object); 
if (multiThreaded) { 
    new Thread(runnableProcessor).start(); 
} 
else { 
    //what to do here? 
} 

그래서 명확히하기 : 내가 스레드를 생성하지 않고, runnableProcessor에서 run() 메소드를 호출 할이 내 현재 코드입니다. 그러나 run()을 직접 호출하는 것이 더 이상 권장되지 않으므로 더 나은 솔루션을 찾으려고합니다.

감사합니다.

+0

multithreded의 의미는 무엇입니까? 당신은 새로운 스레드를 시작하지만 첫 번째 옵션은 sencond에서 async as as synchronized로 시작한다. –

+0

새 프로젝트에 원시 스레드를 사용하지 말 것을 제안합니다. 대신 ExecutorService API를 사용하는 것이 좋습니다. 그것은 당신을 위해 쓰레드의 라이프 사이클을 관리하는 + 당신을 위해 캐싱되고 풀 된 쓰레드를 제공 할 수있는 많은 구현을 가지고 있습니다. 당신의 코드에서, 당신은'executor.execute (someRunnable); – Multithreader

답변

5

단순히 가되지 않는 (Runnable 단 하나의 방법, run을 가지고로하고,이 학급 전체가 너무되지되는 것을없이 사용되지 수 없습니다)하지runnableProcessor.run();를 호출합니다.

1

는 문서에 따르면, run()는 사람들이 Runnable 유형이 포함되는 경우, 사람들은 일반적으로 새로운 Thread을 시작하려는 때문에 그들이 새로운 Thread을 시작할 때 만드는 것이 단지 일반적인 실수, 사용되지되지 않습니다.

documentation에서 알 수 있듯이 거기에는 더 이상 사용되지 않는 태그가 없습니다! 여기

1

가장 간단한 방법입니다 : 당신이 별도의 스레드에서 클래스를 실행하지 않으려면

  1. 당신이 별도의 스레드에서 클래스를 실행하려면, 전화 start 방법
  2. 다음 전화 run 방법. run을 실행하면 동일한 스레드에서 순차적으로 실행됩니다.
5

run은 더 이상 사용되지 않으며 순차 처리가 필요한 특정 인스턴스에 대해서는 호출해야합니다.

또는 논리를 모두 별도의 방법으로 사용할 수 있으며 run 대신이 메서드를 호출 할 수 있습니다. run도 그 안에이 메소드를 호출합니다

run(){ 
doOp(); 
} 

public doOp(){ 
//all your code here 
} 

발신자 대신 rundoOp를 호출 할 수 있지만 효과적으로 차이가 없습니다!

1

run() 메서드를 호출하면됩니다. 전에 말했듯이, 그것은 전혀 사용되지 않습니다.

멀티 스레드 상황에서와 마찬가지로 새로 Thread을 호출하여 시작하고 thread.join()을 호출하여 주 스레드가 새로 시작한 스레드가 완료 될 때까지 대기하게 할 수 있습니다.

1

아시고 직접() RunnableProcess의 두 가지 접근 방법에

1.call 실행을 수행 할 수 있습니다.

2. 로직을 분리하여 별도의 메소드를 분리하고 비 멀티 스레드 시나리오에서 해당 메소드를 호출하십시오. 그 메소드는 run() 내에서 호출되어야합니다.

run(){ 
    do(); 
} 

do(){ 
    //your code here 
} 



if(multithreaded) 
    new Thread(runnableProcess).start(); 
else 
    runnableProcess.do(); 
관련 문제