2012-09-05 73 views
-1

我正在運行下面的程序,但由於某種原因,它看起來不像我正在運行run()方法。基本上我試圖發現的threads.I我得到的結果如下行爲:
Java中的線程行爲

pqni392fr8dchsdmajglvuqsof
pqni392fr8dchsdmajglvuqsof有醒來
l79uho1tjtot7pcmk4vhh5t8qc
l79uho1tjtot7pcmk4vhh5t8qc有醒來
adfapus6g1fst56daimrudkgji
adfapus6g1fst56daimrudkgji已經醒來
iqfo9knc99kcb622g36c77m62
iqfo9knc99kcb622g36c77m62已醒來
67vdpghqit1a 4iv3593451ps0a
67vdpghqit1a4iv3593451ps0a有醒來

正如你看到的,我沒有得到的run()方法,其中一個線程應該sleep.what是什麼問題? 另一個問題是,線程是否可以從程序的第一次運行中執行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

已經** **被喚醒了 – qdii

+0

當我這樣做,我正在運行,並不是說我已經爲設置一個名稱的一個匿名的線程。你得到像「線程池1線程5睡8」的東西? – user1207965

+1

@ user1207965你更改同一個線程的名字,一個你正在運行... – MadProgrammer

回答

2

您在提交主線程爲您的應用作爲RunnableExecutorService反覆。我不確定在主線程上調用run()的定義的行爲(如果有的話,可能是未定義的)是什麼,但它肯定是不正確的。您想創建新的myThread對象,並將它們提交給ExecutorService

+0

萬一有人很好奇,調用'的run()'在甲骨文的JRE主線程不執行任何操作,並返回。 – Dev

3

您永遠不會將myThread的實例傳遞給您的ExecutorService,而是執行與當前線程相關的所有內容。

您的代碼:

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睡眠4,等...
但沒有得到已命名線程睡眠! – user1207965

+0

那個輸出來自你的調用之前的線,使線程睡眠,正確?如果是這樣,你的線程要麼被打斷,要麼實際上*正在睡覺,但是50毫秒的睡眠時間並不明顯。 – Vulcan