Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的线程行为_Java - Fatal编程技术网

Java中的线程行为

Java中的线程行为,java,Java,我正在运行下面的程序,但由于某些原因,它看起来不像我正在运行run()方法。基本上,我试图发现线程的行为。我得到的结果如下: pqni392fr8dchsdmajglvuqsof pqni392fr8dchsdmajglvuqsof已唤醒 L79UHO1JTOT7PCMK4VHH5T8QC L79UHO1JTOT7PCMK4VHH5T8QC已唤醒 adfapus6g1fst56daimrudkgji adfapus6g1fst56daimrudkgji已唤醒 iqfo9knc99kcb622g3

我正在运行下面的程序,但由于某些原因,它看起来不像我正在运行run()方法。基本上,我试图发现线程的行为。我得到的结果如下:

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);