Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Threadpool - Fatal编程技术网

Java线程池

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

这是我第一次在我的新项目中使用Java线程池,在我遇到这个问题之后 link,我对此比较困惑,这是页面上的代码

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可用于运行各种线程)进行旋转每次调用主线程时,它都会将主线程的时间片放弃给任何其他可运行线程。

感谢您的澄清