2013-09-26 5 views
-3

함수가 여러 스레드 (함수 호출이 발생한 후 생성됨)에 의해 처리되는 함수가 있습니다. 그러나 프로그램을 실행할 때 함수가 끝나기 전에 스레드에서 NullPointerException을받습니다. Java에서 스레드를 일찍 시작하지 않도록 지정하려면 어떻게합니까?Java Runnables는 호출되기 전에 실행을 시작합니다.

for 루프를 통해 첫 번째 반복에
public class MainThread extends Thread { 
    public MainClass() { 
    ... 
    myRunnable1 = new myRunnable(args[]); 
    myRunnable2 = new myRunnable(args[]); 
    ... 
    } 
    public void run() { 
     for (someNumberOfRuns) { 
      function1(); 
      System.out.println("Done"); 
      thread1 = new Thread(myRunnable); 
      thread2 = new Thread(myRunnable); 
      thread1.start(); 
      thread2.start(); 
      ... 
     } 
    } 
} 

, thread1와 thread2가 NullPointException 오류가 발생합니다 모두, 시스템은 "완료"인쇄됩니다. 누구도 두 스레드가 각각의 start() 메소드를 호출하기 전에 왜 시작하는지 알 수 있습니까? 감사합니다. . (자바 버전은 1.6u26 임)

+6

실제로 _relevant_ 코드와 실행 방법의 예를 게시하십시오. 주장과 함께. –

+0

> "for (someNumberOfRuns) {" Java 코드로 구문 분석하지 않습니다. 다시 시도하십시오. –

+1

Thread를 확장하지 말고, 혼동을 피하기 위해 Runnable을 구현해야합니다. 문제를 컴파일하고 보여주는 실제 코드를 게시 할 수 있습니까? –

답변

1

두 스레드가 각각의 start() 메소드보다 먼저 호출되는 이유를 아는 사람이 있습니까?

Java에서는 이러한 일이 발생하지 않습니다. 스레드가 시작되면 일부 코드가 시작됩니다. 나는 당신이 어느 메서드를 MainThread을 인스턴스화하는 스레드에서 직접 호출하거나 예상치 못한 곳에서 start()을 호출하고 있다고 의심합니다.

use a debugger 인 경우 도움이 될 수 있으며 누가 호출했는지 확인하기 위해 run() 메서드에 중단 점을 넣을 수 있습니다. 실제로 MainThread 인스턴스화하는 코드를 제공하는 경우

new Throwable().printStackTrace(); 

우리가 더 당신을 도울 수 있습니다 : 디버깅 println를 사용하려면 당신은 run()의 내부 스택 추적을 보여줍니다 예외를 출력 할 수있다. 모든 스레드의 무리를 만드는 방법을 요구하는 경우

0

는 각 스레드의 Runnable을 실행하고, 실행의 첫 번째 줄을() 할 수 있고, 같은 시간에 시작 기다릴

barrier.await(LONG_TIMEOUT_MS, TimeUnit.MILLISECONDS); 
시작하기에 그들 모두를위한 준비가되면 장벽이

final CyclicBarrier barrier = new CyclicBarrier(numThreads + 1); 

으로 정의된다

그런 다음, 전화

// Wait for all threads to be ready, then start them all at once 
barrier.await(LONG_TIMEOUT_MS, TimeUnit.MILLISECONDS); 

시간 초과는 스레드 중 하나가 주어진 시간 동안 실행하지 않았 음을 나타냅니다.

관련 문제