2012-09-05 40 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