Java 此代码中创建了多少个线程?
Java 此代码中创建了多少个线程?,java,multithreading,Java,Multithreading,Executors.newFixedThreadPool(5)在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程 那么总共创建了105个线程?我原以为只创建了5个线程,但每个Runnable也是一个线程 ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 100; i++) { Runnable wor
Executors.newFixedThreadPool(5)
在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程
那么总共创建了105个线程?我原以为只创建了5个线程,但每个Runnable
也是一个线程
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
ExecutorService executor=Executors.newFixedThreadPool(5);
对于(int i=0;i<100;i++){
Runnable worker=新WorkerThread(“+i”);
执行人,执行人(工人);
}
executor.shutdown();
不要将线程
类与线程混淆。Java使用Thread
类生成线程,但它不一定是一对一的映射
在代码中,您的WorkerThread
类似乎是Thread
的子类。然而,Thread
也实现了Runnable
,这就是您的ExecutorService
使用它的方式。它只是在启动的5个线程中的一个线程内调用其run()
方法。
此代码中创建了多少个线程
由
执行器服务启动的所有线程
不要将线程
类与线程混淆。Java使用Thread
类生成线程,但它不一定是一对一的映射
在代码中,您的WorkerThread
类似乎是Thread
的子类。然而,Thread
也实现了Runnable
,这就是您的ExecutorService
使用它的方式。它只是在启动的5个线程中的一个线程内调用其run()
方法。
此代码中创建了多少个线程
由
ExecutorService
启动的ARunnable
的所有线程都不是正在运行的线程。无论是可调用的
还是线程
只有当您.start()
Athread
(它将.run()
ARunnable
或.call()
ACallable
)时,才会在JVM级别创建线程;在那之前,它们只是普通的、规则的对象
当您使用执行器时,它将管理可运行的
或可调用的
并在可以的时候启动“真实”线程。可运行的
不是运行线程。无论是可调用的
还是线程
只有当您.start()
Athread
(它将.run()
ARunnable
或.call()
ACallable
)时,才会在JVM级别创建线程;在那之前,它们只是普通的、规则的对象
当您使用执行器
时,它将管理可运行的
或可调用的
并在可以的时候启动“真实”线程
newFixedThreadPool(5)在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程
这是不对的。固定大小的线程池执行器将创建5个工作线程。您的100个Runnable
s都被添加到这5个线程所从的队列中。因此,在任何给定时间,只有5个Runnable
s正在执行。有5个线程(加上主线程,如果使用Swing,可能还有EDT,当然还有显式创建的任何其他无关线程)
我原以为只创建了5个线程,但每个Runnable也是一个线程
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
Runnable
不是线程。顾名思义,Runnable
,就是可以运行的东西。对于固定大小的线程池,它由池中的一个线程运行。根据(重点矿山)的文件:
Runnable接口应由其实例将由线程执行的任何类实现
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
我相信您的困惑的根源可能是您的Runnable
s被不恰当地命名为WorkerThread
,即使它们不是线程。此外,Thread
还实现了Runnable
,这一事实可能会让您感到困惑。实际上,这从字面上意味着线程
是一个可运行的
,而不是可运行的
是一个线程
——而线程
在启动之前甚至不是一个线程
newFixedThreadPool(5)在池中创建5个线程,然后在循环中再创建100个线程。这种理解正确吗?然后池中的5个线程将执行100个工作线程队列中的每个线程
这是不对的。固定大小的线程池执行器将创建5个工作线程。您的100个Runnable
s都被添加到这5个线程所从的队列中。因此,在任何给定时间,只有5个Runnable
s正在执行。有5个线程(加上主线程,如果使用Swing,可能还有EDT,当然还有显式创建的任何其他无关线程)
我原以为只创建了5个线程,但每个Runnable也是一个线程
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
Runnable
不是线程。顾名思义,Runnable
,就是可以运行的东西。对于固定大小的线程池,它由池中的一个线程运行。根据(重点矿山)的文件:
Runnable接口应由其实例将由线程执行的任何类实现
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 100; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
我相信你困惑的根源可能是你的Runnable
s的名字不恰当