Java中的线程行为
我正在运行下面的程序,但由于某些原因,它看起来不像我正在运行run()方法。基本上,我试图发现线程的行为。我得到的结果如下:Java中的线程行为,java,Java,我正在运行下面的程序,但由于某些原因,它看起来不像我正在运行run()方法。基本上,我试图发现线程的行为。我得到的结果如下: pqni392fr8dchsdmajglvuqsof pqni392fr8dchsdmajglvuqsof已唤醒 L79UHO1JTOT7PCMK4VHH5T8QC L79UHO1JTOT7PCMK4VHH5T8QC已唤醒 adfapus6g1fst56daimrudkgji adfapus6g1fst56daimrudkgji已唤醒 iqfo9knc99kcb622g3
pqni392fr8dchsdmajglvuqsof
pqni392fr8dchsdmajglvuqsof已唤醒
L79UHO1JTOT7PCMK4VHH5T8QC
L79UHO1JTOT7PCMK4VHH5T8QC已唤醒
adfapus6g1fst56daimrudkgji
adfapus6g1fst56daimrudkgji已唤醒
iqfo9knc99kcb622g36c77m62
iqfo9knc99kcb622g36c77m62已唤醒
67vdpghqit1a4iv3593451ps0a
67vdpghqit1a4iv3593451ps0a已唤醒
如您所见,我没有使用run()方法,线程应该在该方法中睡眠。问题是什么? 还有一个问题,线程是否可以从程序的第一次运行执行run(),因为我注意到输出的第一行总是来自main() 多谢各位
您正在将应用程序的主线程作为
Runnable
反复提交给ExecutorService
。我不确定在主线程上调用run()
的已定义行为(如果有的话,可以是未定义的)是什么,但它肯定是不正确的。您希望创建新的myThread
对象,并将其提交给ExecutorService
。您从不将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。但这与运行时问题无关。当我这样做时,我得到的是运行的匿名线程,而不是我已经为其设置了名称的线程。你会得到类似“Thread pool-1-Thread-5 sleeping 8”@user1207965你正在更改同一个线程的名称,也就是你正在运行的线程…以防万一有人好奇,在Oracle的JRE的主线程上调用
run()
,什么都不做并返回。你也可以使用ThreadFactory
,但我想已经有足够多的困惑了。很好的帖子虽然Hi Vulcan,但我还是得到了输出:线程池-1-Thread-5-4,等等但是不能让已经命名的线程睡眠!该输出来自调用使线程休眠之前的行,对吗?如果是这样,线程要么被中断,要么实际上正在休眠,但50毫秒的休眠时间是不可见的。
Thread myThread = new Thread(new myThread());
myThread.setName(new BigInteger(130, new SecureRandom()).toString(32));
System.out.println(myThread.getName());
myService.submit(myThread);