2012-09-05 3 views
-1

아래의 프로그램을 실행하고 있는데 어떤 이유로 run() 메소드가 보이지 않습니다. 기본적으로 나는 아래 threads.I이 결과를 얻고의 동작 탐지하는 것을 시도하고있다 :이
l79uho1tjtot7pcmk4vhh5t8qc l79uho1tjtot7pcmk4vhh5t8qc
깨워
Java에서의 스레드 동작


pqni392fr8dchsdmajglvuqsof pqni392fr8dchsdmajglvuqsof있다
adfapus6g1fst56daimrudkgji
adfapus6g1fst56daimrudkgji는
깨워했다 일어나 iqfo9knc99kcb622g36c77m62
iqfo9knc99kcb622g36c77m62 깨우기가
67vdpghqit1a입니다. 4iv3593451ps0a
67vdpghqit1a4iv3593451ps0a는 내가 자형은해야 스레드가 문제가되는 run() 메소드에 도착하고 있지 않다시피

깨워있다? 또 다른 질문은 스레드가 프로그램의 첫 번째 실행에서 run()을 실행할 수 있었기 때문입니다. 출력의 첫 번째 행이 항상 main()에서 왔기 때문입니다.

감사합니다.


import java.math.BigInteger; 
import java.security.SecureRandom; 
import java.util.Random; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.logging.Level; 
import java.util.logging.Logger; 



class myThread implements Runnable { 

    @Override// method run is to be executed by a new thread 
    public void run() { 
     System.out.println("I am here"); 
     int timeRandom = new Random().nextInt(50); 

     try { 
      String ThrName = Thread.currentThread().getName(); 
      Thread.sleep(timeRandom); 
      System.out.println("Thread " + ThrName + " sleeping " + timeRandom); 
      } catch (InterruptedException ex) { 
      Logger.getLogger(myThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     //  throw new UnsupportedOperationException("Not supported yet."); 


    } 
} 

class myClass { 

    static int nthread = 5; 

    public static void main(String[] args) { 
     ExecutorService myService = Executors.newFixedThreadPool(nthread); 
     while (nthread != 0) { 
      Thread.currentThread().setName(new BigInteger(130, new SecureRandom()).toString(32)); 
      System.out.println(Thread.currentThread().getName()); 
      myService.submit(Thread.currentThread()); 

      System.out.println(Thread.currentThread().getName() + " has wake up"); 
      // 
      nthread -= 1; 
     } 
     myService.shutdown(); 
    } 
} 
+0

** woken ** up – qdii

+0

내가 할 때 익명의 스레드가 실행되고 있는데, 이미 이름을 설정 한 스레드가 아닙니다. 그리고 "Thread pool-1-thread-5 sleeping 8"과 같은 것을 얻을 수 있습니까? – user1207965

+1

@ user1207965 당신이 실행중인 SAME 스레드의 이름을 바꾸고 있습니다 ... – MadProgrammer

답변

2

당신은 반복적으로 ExecutorServiceRunnable 같은 응용 프로그램의 주 스레드를 제출한다. 무슨 정의 된 동작 (있는 경우, 정의되지 않을 수 있습니다) 주 스레드에서 run() 호출의 확실하지 않지만, 그것은 확실히 정확하지 않습니다. 새 myThread 개체를 만들고 대신 ExecutorService에 제출하려고합니다.

+0

오라클 JRE의 메인 스레드에서'run()'을 호출하면 아무 일도 일어나지 않고 호기심을 느끼게됩니다. – Dev

3

ExecutorService에 myThread의 인스턴스를 전달하지 않고 대신 현재 스레드와 관련된 모든 작업을 수행하고 있습니다.

귀하의 코드 :

Thread.currentThread().setName(new BigInteger(130, new SecureRandom()).toString(32)); 
System.out.println(Thread.currentThread().getName()); 
myService.submit(Thread.currentThread()); 

코드 생성 예상 결과 : 또한

Thread myThread = new Thread(new myThread()); 
myThread.setName(new BigInteger(130, new SecureRandom()).toString(32)); 
System.out.println(myThread.getName()); 
myService.submit(myThread); 

, 보조 노트로, Java 규약에 해당 클래스 이름은 대문자로 선언 지시; myClass는 MyClass 여야하고 myThread는 myThread 여야합니다. 런타임 문제와는 관련이 없습니다.

+0

당신은 또한'ThreadFactory'를 사용할 수 있습니다 만, 나는 혼란 스러울 정도로 혼란스러워하고 있습니다. 좋은 게시물 비록 – MadProgrammer

+0

안녕하세요 벌컨, 여전히 출력으로 받고있어 : 스레드 풀 -1 스레드 5 5, 4 자고 ...
하지만 잠을 이미 명명 된 스레드를 받고 있지 않습니다! – user1207965

+0

그 출력은 스레드가 잠자기 상태가되기 직전의 라인에서 나온 것입니까? 그렇다면 스레드가 인터럽트 중이거나 실제로 슬리핑 중이지만 50 밀리 초의 절전 시간은 눈에 띄지 않습니다. – Vulcan