Java线程池
这是我第一次在我的新项目中使用Java线程池,在我遇到这个问题之后 link,我对此比较困惑,这是页面上的代码Java线程池,java,multithreading,threadpool,Java,Multithreading,Threadpool,这是我第一次在我的新项目中使用Java线程池,在我遇到这个问题之后 link,我对此比较困惑,这是页面上的代码 package com.journaldev.threadpool; public class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override
package com.journaldev.threadpool;
public class WorkerThread implements Runnable {
private String command;
public WorkerThread(String s){
this.command=s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+' Start. Command = '+command);
processCommand();
System.out.println(Thread.currentThread().getName()+' End.');
}
private void processCommand() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString(){
return this.command;
}
}
package com.journaldev.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SimpleThreadPool {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread('' + i);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println('Finished all threads');
}
}
package com.journaldev.threadpool;
公共类WorkerThread实现Runnable{
私有字符串命令;
公共WorkerThread(字符串s){
this.command=s;
}
@凌驾
公开募捐{
System.out.println(Thread.currentThread().getName()+'Start.Command='+Command);
processCommand();
System.out.println(Thread.currentThread().getName()+'End');
}
私有void processCommand(){
试一试{
睡眠(5000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
@凌驾
公共字符串toString(){
返回此命令;
}
}
包com.journaldev.threadpool;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类SimpleThreadPool{
公共静态void main(字符串[]args){
ExecutorService executor=Executors.newFixedThreadPool(5);
对于(int i=0;i<10;i++){
Runnable worker=新WorkerThread(“”+i);
执行人,执行人(工人);
}
executor.shutdown();
而(!executor.isTerminated()){
}
System.out.println('Finished all threads');
}
}
在代码中,创建了一个固定大小的池,并创建了10个工作线程,对吗
线程池应该减少系统的负担,相反,在上面的代码中,我认为除了工作线程之外,它还通过创建池来增加负担。为什么要费心使用线程池呢
有人能解释一下吗?
谢谢
我也读了这篇关于StackOverflow的文章
这对我也没有帮助。这令人困惑,因为Runnable被命名为WorkerThread,但它们没有扩展java.lang.Thread,它们只是实现Runnable的对象。通过实现Runnable,您可以指定需要执行的任务,而无需实例化实际的线程对象。示例中创建的线程只有主线程和执行器创建的线程
请注意,即使更改此代码以使WorkerThread扩展线程,只要代码不对其调用start,也不会导致更多线程实际运行。构造线程对象涉及一些事情,如使用安全管理器进行检查和初始化threadlocals,但实际上在操作系统级别并没有执行任何分配线程的操作。就执行器而言,它们只是可运行的,它将使用线程池的线程执行它们。这令人困惑,因为可运行的名称为WorkerThread,但它们不扩展java.lang.Thread,它们只是实现可运行的对象。通过实现Runnable,您可以指定需要执行的任务,而无需实例化实际的线程对象。示例中创建的线程只有主线程和执行器创建的线程
请注意,即使更改此代码以使WorkerThread扩展线程,只要代码不对其调用start,也不会导致更多线程实际运行。构造线程对象涉及一些事情,如使用安全管理器进行检查和初始化threadlocals,但实际上在操作系统级别并没有执行任何分配线程的操作。就执行器而言,它们只是可运行的,它将使用线程池的线程执行它们。坏例子!名为WorkerThread的类不是线程,而是“任务” 线程隐藏在Executor服务中。该示例创建了一个包含五个“工作”线程的ExecutorService,它创建了十个任务,它要求executor服务“执行”它们,最后,它等待所有任务完成。完全由ExecutorService决定如何、何时以及在哪个工作线程中执行每个任务
该示例的另一个较小的问题是主线程在请求executor服务关闭后如何等待。它使用可能被一个或多个工作线程使用的CPU资源(取决于主机可用于运行各种线程的CPU数量)旋转。等待循环应该调用Thread.yield(),每次调用时,它都会将主线程的时间片放弃给任何其他可运行线程。坏例子!名为WorkerThread的类不是线程,而是“任务” 线程隐藏在Executor服务中。该示例创建了一个包含五个“工作”线程的ExecutorService,它创建了十个任务,它要求executor服务“执行”它们,最后,它等待所有任务完成。完全由ExecutorService决定如何、何时以及在哪个工作线程中执行每个任务
该示例的另一个较小的问题是主线程在请求executor服务关闭后如何等待。它使用一个或多个工作线程可能使用的CPU资源(取决于主机有多少CPU可用于运行各种线程)进行旋转每次调用主线程时,它都会将主线程的时间片放弃给任何其他可运行线程。感谢您的澄清