Executor和new Thread()

博客指出new Thread存在性能差、缺乏统一管理、功能不足等弊端。而Java提供的四种线程池能重用线程,减少开销,性能更佳;可控制并发线程数,提高资源使用率;还具备定时执行等多种功能。最后给出了Executor执行Callable任务的示例代码。

new Thread的弊端如下:

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
Executor执行Callable任务的示例代码:

import java.util.ArrayList;   
import java.util.List;   
import java.util.concurrent.*;   
  
public class CallableDemo{   
    public static void main(String[] args){   
        ExecutorService executorService = Executors.newCachedThreadPool();   
        List<Future<String>> resultList = new ArrayList<Future<String>>();   
  
        //创建10个任务并执行   
        for (int i = 0; i < 10; i++){   
            //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中   
            Future<String> future = executorService.submit(new TaskWithResult(i));   
            //将任务执行结果存储到List中   
            resultList.add(future);   
        }   
  
        //遍历任务的结果   
        for (Future<String> fs : resultList){   
                try{   
                    while(!fs.isDone);//Future返回如果没有完成,则一直循环等待,直到Future返回完成  
                    System.out.println(fs.get());     //打印各个线程(任务)执行的结果   
                }catch(InterruptedException e){   
                    e.printStackTrace();   
                }catch(ExecutionException e){   
                    e.printStackTrace();   
                }finally{   
                    //启动一次顺序关闭,执行以前提交的任务,但不接受新任务  
                    executorService.shutdown();   
                }   
        }   
    }   
}   
  
  
class TaskWithResult implements Callable<String>{   
    private int id;   
  
    public TaskWithResult(int id){   
        this.id = id;   
    }   
  
    /**  
     * 任务的具体过程,一旦任务传给ExecutorService的submit方法, 
     * 则该方法自动在一个线程上执行 
     */   
    public String call() throws Exception {  
        System.out.println("call()方法被自动调用!!!    " + Thread.currentThread().getName());   
        //该返回结果将被Future的get方法得到  
        return "call()方法被自动调用,任务返回的结果是:" + id + "    " + Thread.currentThread().getName();   
    }   
}  

### JavaThread 类与 Executor 框架的关系及区别 #### 1. Thread 类 `Thread` 是 Java 中最基本的线程类,用于表示一个线程。通过创建 `Thread` 的实例并调用其 `start()` 方法,可以启动一个新的线程[^2]。每个线程都运行在独立的执行路径上,并且可以通过继承 `Thread` 或实现 `Runnable` 接口来定义线程的任务内容。 代码示例: ```java class MyThread extends Thread { @Override public void run() { System.out.println("Thread is running"); } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } ``` #### 2. Executor 框架 `Executor` 是一套线程池管理框架,从 JDK 1.5 开始引入,用于将任务提交与任务执行机制分离。它提供了一种高级的线程管理调度方式,避免了直接使用 `Thread` 类所带来的局限性[^1]。`Executor` 框架的核心接口包括 `Executor`、`ExecutorService` `ScheduledExecutorService`,并且提供了多种线程池实现,例如 `ThreadPoolExecutor` `ForkJoinPool`。 代码示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); executor.execute(() -> System.out.println("Task executed by Executor")); executor.shutdown(); } } ``` #### 3. 关系 - `Thread` 类是 Java 中最基础的线程实现方式,而 `Executor` 框架则是更高层次的抽象,用于管理调度线程池。 - 在 `Executor` 框架中,任务通常以 `Runnable` 或 `Callable` 的形式提交给线程池,线程池中的线程负责执行这些任务。这与直接创建启动 `Thread` 实例的方式不同[^1]。 - `Executor` 框架内部仍然依赖于 `Thread` 类来实现线程的实际运行,但通过线程池机制,它可以更高效地复用线程,减少线程创建销毁的开销[^3]。 #### 4. 区别 | 特性 | Thread 类 | Executor 框架 | |--------------------|---------------------------------------|---------------------------------------| | 线程管理 | 需要手动创建销毁线程 | 使用线程池自动管理线程生命周期 | | 资源消耗 | 每次创建新线程都会带来额外开销 | 线程复用,降低资源消耗 | | 任务提交方式 | 直接创建 `Thread` 实例并调用 `start()` | 提交 `Runnable` 或 `Callable` 到线程池 | | 扩展性 | 较低 | 提供丰富的线程池配置选项 | | 异步结果支持 | 不支持 | 支持通过 `Future` 获取异步任务结果 | #### 5. 示例对比 ##### 使用 Thread 类 ```java class MyThread extends Thread { @Override public void run() { System.out.println("Thread is running"); } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } ``` ##### 使用 Executor 框架 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> System.out.println("Task executed by Executor")); executor.shutdown(); } } ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值