在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor之后,这是我第一次为新项目使用Java线程池。 .html,我对此更加困惑,这是页面中的代码,
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'); } }
在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗?
线程池应该减轻系统的负担,相反,在上面的代码中,我认为通过在工作线程之外创建池来增加负担。为什么要麻烦使用线程池?
谁能解释?谢谢
这令人困惑,因为可运行对象被命名为WorkerThread,但是它们不扩展java.lang.Thread,它们只是实现可运行对象的对象。实施Runnable使您可以指定需要执行的任务,而不必实例化实际的Thread对象。在您的示例中创建的唯一线程是主线程和执行程序创建的线程。
请注意,即使您更改此代码以使WorkerThread扩展Thread,只要代码不对其调用start,也不会导致实际运行更多线程。构造线程对象涉及到诸如与安全管理器进行检查以及初始化threadlocals之类的事情,但是实际上在操作系统级别上并没有做任何事情来分配线程。就执行程序而言,它们只是Runnable,它将使用线程池的线程执行它们。