Runable与Callable的区别
Runable与Callable的区别:
public interface Callable<V> {
V call() throws Exception;//V是Callable返回值的类型
}
public interface Runnable {
public abstract void run();
}
Callable的3种启动线程的方式
1、Thread启动
public class CallableImpl implements Callable<String> {
private String acceptStr;
public CallableImpl(String acceptStr) {
this.acceptStr = acceptStr;
}
@Override
public String call() throws Exception {
// 任务等待1 秒
Thread.sleep(1000);
return this.acceptStr + ",hello!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//Callable<String> callable = new CallableImpl("afei");
CallableImpl impl=new CallableImpl ("afei");
FutureTask<String> task = new FutureTask<String>(impl);
long beginTime = System.currentTimeMillis();
// 创建线程
new Thread(task).start();
// 调用get()阻塞主线程,反之,线程不会阻塞
String result = task.get();//阻塞主线程,直至1s后获取到call()的返回内容
System.out.println("hello : " + result);//返回:afei,hello!
}
}
2、ExecutorService 启动
public class CallableImpl implements Callable<String> {
private String acceptStr;
public CallableImpl(String acceptStr) {
this.acceptStr = acceptStr;
}
@Override
public String call() throws Exception {
// 任务等待1 秒
Thread.sleep(1000);
return this.acceptStr + ",hello!";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool(); // 创建线程池
// 向里面扔任务并执行该任务,同时返回一个包含call()方法返回值的Featured对象
CallableImpl impl=new CallableImpl(“afei");
Future<String> future=exec.submit(impl);
System.out.println(future.get()); //打印线程(任务)执行的结果
exec.shutdown();// 关闭线程池后不接受新任务,已经在线程池的任务会被执行完
}
}
3、controler方法中直接返回Callable对象或其派对象
@RestController
public class IAsyncController {
private Logger logger=LoggerFactory.getLogger(getClass());
@PostMapping("/async/back")
public Callable<String> back(){
logger.info("主线程开始");
Callable<String> c=new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
logger.info("副线程开始等待1s...");
Thread.sleep(1000);
logger.info("副线程结束等待");
return "afei";
}
};
logger.info("主线程结束并返回");
return c;//启动副线程并返回call()的返回值
}
}
Runnable的3种启动线程的方式:
1、继承Thread类
public class Test extends Thread{
public void run(){
//操作临界资源
}
public static void main(String[] args){
Test t=new Test();
t.start();//启动线程
}
}
2、继承Runnable接口
public class Test implements Runnable{
public void run(){
//操作临界资源
}
public static void main(String[] args){
Test t=new Test();
Thread thread=new Thread(t);
thread.start();//启动线程
}
}
3、无名线程
public class Test{
public static void main(String[] args){
new Thread(()->{ //启动一个线程
System.out.pritln("启动一个线程);
}).start();
}
}
Runable与Callable的区别的更多相关文章
- Runnable和Callable 的区别
Runnable和Callable 的区别 01.Runnable接口中只有一个run()没有返回值 没有声明异常 Callable接口中只有一个call()有返回值 有声明异常 02.Calla ...
- Java线程—-Runnable和Callable的区别和联系
Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...
- Runnable 和 Callable的区别
Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- java中高级
面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...
- java中高级面试题整理及参考答案
面试问题: 一.Java基础方面: 1.Java面相对象的思想的理解(主要是多态): http://blog.csdn.net/zhaojw_420/article/details/70477636 ...
- Java中线程和线程池
Java中开启多线程的三种方式 1.通过继承Thread实现 public class ThreadDemo extends Thread{ public void run(){ System.out ...
- java多线程并发(一)-- 相关基础知识
java多线程的知识是java程序员都应该掌握的技能,目前我接触的项目上用的不多,花点时间熟悉熟悉. 一.基础知识 1.什么是进程? 进程是具有一定独立功能的正在运行过程中的程序,是操作系统进行资源分 ...
- 《Java多线程面试题》系列-创建线程的三种方法及其区别
1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...
随机推荐
- 从文件下载视角来理解Web API
一.问题源起 从Web From过来的人应该会比较熟悉以下下载文件的代码: [HttpPost] [Route("Download")] public void Download( ...
- Spring Cloud与Spring Boot版本匹之间的关系
由于学习的起步较晚,创建项目的时候一直采用的都是较新的springboot,用的2.0.2.RELEASE版本.参照网上的示例进行实验的时候,有时候会才坑,特记录一二以备忘 首先就是SpringBoo ...
- SpringBoot和SpringCloud?
SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间 ...
- java 中有几种方法可以实现一个线程?
继承 Thread 类 实现 Runnable 接口 实现 Callable 接口,需要实现的是 call() 方法
- [性能测试] locust学习-基础篇
在本文中,我将介绍一个名为Locust的性能测试工具.我将从Locust的功能特性出发,结合实例对Locust的使用方法进行介绍. 概述 Locust主要有以下的功能特性: 在Locust测试框架中, ...
- 微信小程序调研
小程序入口 微信发现,小程序 公众号主体查看小程序 好友分享,群分享 公众号自定义菜单跳转 APP页面跳转 第三方服务 附近的小程序 扫普通链接二维码打开小程序 需要后台开启功能,开启后,用户在微信& ...
- Java/C++实现命令模式---多次撤销和撤回
某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现.\ 类图: Java代码: ...
- 【Android开发】【数据库】Realm For Android
目录 1.Realm简介 2.环境配置 3.初始化Realm 4.创建实体 5.增 6.删 7.改 8.查 9.异步操作 10.数据库数据更新监听 11.json转对象,插入数据库 12.Demo地址 ...
- VSCode使用Settings Sync同步配置和插件
转载参考地址:https://www.cnblogs.com/zzhaolei/p/12028241.html 1.需求 自己平常工作,一般在公司用公司的电脑,在家里就是自己的,但是vscode如果配 ...
- vue实现省市区三级联动
npm 安装 npm install v-distpicker --save Vue全局引入组件 import Distpicker from 'v-distpicker' Vue.component ...