关于Executors.newSingleThreadExecutor()的作用!-这个代码有问题,误导了大家抱歉

本文介绍了一个使用Java实现的单线程池的例子,并演示了当线程池中的唯一线程遇到除零错误时如何自动重启该线程以恢复运行。通过随机数生成和异常捕获机制展示了线程池的健壮性和自恢复能力。

 

Executors.newSingleThreadExecutor()返回一个线程池(这个线程池只有一个线程)

,这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去!

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
      
      
public class Yao implements Runnable {
          
public String name ;
      
public Yao(String name){
          
    this.name = name;
          
}
public static void foo(Yao d) {
          
      d = new Yao("Fifi");
            
}
      
 public static void main(String[] args) {
       
     Yao yao = new Yao("Max");
           
     foo(yao);
           
     System.out.println(" aDog.name.equals Max = "+ yao.name.equals("Max"));
           
     ExecutorService eService = Executors.newSingleThreadExecutor();
     eService.execute(yao);
           
 }
@Override
public void run() {
    int temp = 0;
    int i = 0;
    Random random =new Random();
    while(true){
        int j =random .nextInt(100);
              
        System.err.println("temp----------->"+temp+"  i---------------->"+(i++)+"    j------------------>"+j);
              
        try{
                  
            if(temp==0&&j>90) temp = 7/0;
                  
            Thread.currentThread().sleep(10);
                  
        }catch(Exception e){
            e.printStackTrace();
                  
            temp = 1;
                  
        }
              
              
    }
          
}
      
}

 

执行的结果如下(注意temp的值的变化和异常输出):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

aDog.name.equals Max = true

temp----------->0  i---------------->0    j------------------>18

temp----------->0  i---------------->1    j------------------>69

temp----------->0  i---------------->2    j------------------>84

temp----------->0  i---------------->3    j------------------>68

temp----------->0  i---------------->4    j------------------>88

temp----------->0  i---------------->5    j------------------>3

temp----------->0  i---------------->6    j------------------>52

temp----------->0  i---------------->7    j------------------>45

temp----------->0  i---------------->8    j------------------>47

temp----------->0  i---------------->9    j------------------>60

temp----------->0  i---------------->10    j------------------>52

temp----------->0  i---------------->11    j------------------>97

java.lang.ArithmeticException: / by zero

    at com.yao.Yao.run(Yao.java:47)

    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

    at java.lang.Thread.run(Thread.java:662)

temp----------->1  i---------------->12    j------------------>6

temp----------->1  i---------------->13    j------------------>44

temp----------->1  i---------------->14    j------------------>30

temp----------->1  i---------------->15    j------------------>58

temp----------->1  i---------------->16    j------------------>87

temp----------->1  i---------------->17    j------------------>5

temp----------->1  i---------------->18    j------------------>29

temp----------->1  i---------------->19    j------------------>69

temp----------->1  i---------------->20    j------------------>37

temp----------->1  i---------------->21    j------------------>99

<think>好的,我现在要解决用户的问题:如何在Java中正确使用Executors.newSingleThreadExecutor方法以及Lambda表达式的实现方式,并且需要给出示例。首先,我需要回忆一下Java的线程池相关知识,特别是newSingleThreadExecutor的用法。 记得Executors类提供了几种创建线程池的静态方法,其中newSingleThreadExecutor会创建一个只有一个工作线程的线程池,任务按顺序执行。这样适合需要保证顺序执行各任务的场景。用户可能想知道如何创建这样的线程池,并提交任务,特别是用Lambda表达式来简化代码。 接下来,Lambda表达式在Java 8中引入,可以替代匿名内部类,比如Runnable或Callable的实现。用户提到想用Lambda表达式,所以需要展示如何用Lambda来提交任务到线程池。 我需要检查如何正确编写Lambda表达式来提交任务。对于Runnable接口,它的run方法没有参数也没有返回值,所以Lambda应该是() -> { ... }的形式。而Callable的call方法返回一个值,可能需要使用submit方法,并且用Future来获取结果。 然后,考虑用户可能的示例需求,应该分步骤说明:创建线程池、提交任务、关闭线程池。示例代码需要展示这两种情况:使用Runnable和Callable的Lambda表达式。 还需要注意线程池的正确关闭,使用shutdown方法,以及可能的异常处理,比如InterruptedException。但用户可能只需要基础示例,所以暂时可以不涉及异常处理的高级部分。 另外,用户提供的引用中提到了Runnable和Callable的Lambda示例,引用[1]、[3]、[4]都与Lambda的使用相关,需要确保示例代码符合这些引用中的正确语法。比如,Runnable的Lambda表达式没有参数,而Callable的可能需要返回值。 可能的问题点:是否在submit的时候正确处理了Callable的返回结果,使用Future对象获取返回值。同时,确保线程池在任务完成后被正确关闭,避免资源泄漏。 现在,组织步骤: 1. 创建单线程线程池:ExecutorService executor = Executors.newSingleThreadExecutor(); 2. 提交Runnable任务:使用execute方法或submit方法,这里可能用execute,但submit也可以。但为了展示Lambda的不同用法,可能两个都展示。 3. 提交Callable任务:必须使用submit方法,返回Future对象,并处理结果。 4. 关闭线程池:executor.shutdown(); 然后,示例代码应该包括这两个任务的提交,使用Lambda表达式。同时,输出结果应该显示任务按顺序执行,因为是单线程。 最后,根据用户的问题,生成相关问题,可能涉及线程池的其他类型、Lambda的其他应用场景,或者异常处理等。 现在检查是否有遗漏:是否提到了单线程池的特点,比如顺序执行、适用于需要顺序处理的场景;是否正确使用了Lambda语法;是否引用了正确的引用来源。例如,引用[5]提到SingleThreadExecutor的执行结果,第三个任务使用第一个线程,说明顺序执行,所以在示例中应该体现这一点。 确保代码示例中的Lambda表达式正确,比如Runnable的写法是() -> { ... },而Callable的可能需要返回一个值,比如() -> "结果"。 总结步骤,编写回答,并附上示例代码,最后生成相关问题。</think>### Java Executors.newSingleThreadExecutor Lambda表达式使用方法 #### 1. 单线程线程池特性 `Executors.newSingleThreadExecutor` 创建的线程池仅包含单个工作线程,所有提交的任务按顺序执行。适用于需要**保证任务顺序性**且不需要并行处理的场景[^5]。 #### 2. 实现步骤 **步骤1:创建线程池** ```java ExecutorService executor = Executors.newSingleThreadExecutor(); ``` **步骤2:提交任务** - **使用Runnable Lambda表达式**(无返回值) ```java executor.execute(() -> System.out.println("Runnable任务执行中...")); ``` - **使用Callable Lambda表达式**(有返回值) ```java Future<String> future = executor.submit(() -> { return "Callable任务完成"; }); ``` **步骤3:关闭线程池** ```java executor.shutdown(); ``` #### 3. 完整示例代码 ```java import java.util.concurrent.*; public class SingleThreadExecutorExample { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建单线程线程池 ExecutorService executor = Executors.newSingleThreadExecutor(); // 提交Runnable任务(Lambda表达式) executor.execute(() -> { System.out.println("任务1: 开始执行"); try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println("任务1: 完成"); }); // 提交Callable任务(Lambda表达式) Future<String> future = executor.submit(() -> { System.out.println("任务2: 计算中..."); return "计算结果: 42"; }); // 获取Callable结果 System.out.println(future.get()); // 关闭线程池 executor.shutdown(); } } ``` **执行结果**: ``` 任务1: 开始执行 任务1: 完成 任务2: 计算中... 计算结果: 42 ``` #### 4. 关键说明 - **顺序性**:所有任务按提交顺序依次执行[^5] - **Lambda语法**:`()->{}` 替代匿名内部类(符合Runnable/Callable接口规范)[^2][^3] - **资源释放**:必须显式调用`shutdown()`避免内存泄漏
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值