关于《Java并发编程之线程池十八问》的补充内容

server/2024/9/24 0:17:28/

一、写在开头

在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。

二、Runnable vs Callable

在创建线程的时候,一般会选用 RunnableCallable 两种方式。

【源码对比】

Runnable接口

java">@FunctionalInterface
public interface Runnable {/*** 被线程执行,没有返回值也无法抛出异常*/public abstract void run();
}

Callable接口

java">@FunctionalInterface
public interface Callable<V> {/*** 计算结果,或在无法这样做时抛出异常。* @return 计算得出的结果* @throws 如果无法计算结果,则抛出异常*/V call() throws Exception;
}
  1. Runnable自 Java 1.0 以来一直存在,Callable在 Java 1.5 时引入;
  2. Runnable 接口不会返回结果或抛出检查异常,Callable 接口可以;
  3. Callable支持泛型,可定义返回值类型,但一般情况下没有返回值时,我们推荐使用Runnable接口,使得代码更简洁!
  4. 工具类 Executors 可以实现将 Runnable 对象转换成 Callable 对象。(Executors.callable(Runnable task) 或 Executors.callable(Runnable task, Object result))。

三、execute() vs submit()

在线程池中我们有两种提交任务的方式,分别是 execute()submit(),虽然我们在上一篇文章中都有用到,但是并没对它们的特点进行总结,这里做一个对比:

  1. execute()方法用于提交不需要返回值的任务ÿ

http://www.ppmy.cn/server/45160.html

相关文章

最长递增子序列,交错字符串

第一题&#xff1a; 代码如下&#xff1a; int lengthOfLIS(vector<int>& nums) {//dp[i]表示以第i个元素为结尾的最长子序列的长度int n nums.size();int res 1;vector<int> dp(n, 1);for (int i 1; i < n; i){for (int j 0; j < i; j){if (nums[i]…

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信息&#xff0c;进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

长安链使用Golang编写智能合约教程(一)

长安链是分2.1.和2.3.两个版本&#xff0c;本节面说的是2.1.的版本 需要2.3.版本的合约&#xff0c;请看教程&#xff08;二&#xff09;&#xff01; 教程&#xff08;二&#xff09;我会写如何查历史数据 教程二&#xff1a;&#xff08;长安链2.3.的版本的智能合约编写&…

代码随想录算法训练营第22天(py)| 二叉树 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 力扣链接 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 思路 如果当前节点元素小于low&#xff0c;递归右子树&#xff0c;返回符合条件的头节点 如果当前节点元…

6.S081的Lab学习——Lab5: xv6 lazy page allocation

文章目录 前言一、Eliminate allocation from sbrk() (easy)解析&#xff1a; 二、Lazy allocation (moderate)解析&#xff1a; 三、Lazytests and Usertests (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0…

C++模拟实现stack容器适配器

源代码&#xff08;CSTL库中的stack容器适配器是通过deque实现的&#xff0c;这里使用vector容器实现&#xff09; #include <iostream> #include <vector> #include <list> using namespace std;namespace mystack {//栈的设计采用适配器模式&#xff1a;即…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下&#xff1a; package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…

uniapp-自定义navigationBar

封装导航栏自定义组件 创建 nav-bar.vue <script setup>import {onReady} from dcloudio/uni-appimport {ref} from vue;const propsdefineProps([navBackgroundColor])const statusBarHeight ref()const navHeight ref()onReady(() > {uni.getSystemInfo({success…