Java线程的基本使用(二)

Java多线程--创建多线程的基本方式二:实现Runnable接口 阅读详情

除了通过Runnable注入以及实现Thread类的run方法之外(其实都是Runnable),java还提供了Callable、Future和FutureTask这几个与多线程相关的概念,不过这几个类型都只能用于线程池中。

Callable声明如下:

public interface Callable<V>{
	V call() throws Exception;
}

Callable感觉和Runnable非常相似,除了上面说的只能用于线程池,不同点在于Callable是一个泛型接口,允许返回一个泛型对象,同时支持抛出异常。

public class ThreadDemo5 {

	public static void main(String[] args) {
		MyThread5<A> t1=new MyThread5<A>();
		ExecutorService pool=Executors.newSingleThreadExecutor();//创建单一线程池
		pool.submit(t1);
	}
	
}

abstract class BaseObject{
	String str;
}

class A extends BaseObject{
	public A(){
		str="This is A.";
	}
}

class MyThread5<T extends BaseObject> implements Callable<T>{

	@Override
	public T call() throws Exception {
		System.out.println("MyThread5的call方法执行");
		return (T) new A();
	}
	
}

执行之后,你会发现,输出了“MyThread5的call方法执行”,但是,要如何获取返回值呢?

我们发现,sumbit方法返回一个Future类的对象,Future类为线程池提供了一些类任务标准:cancle用于对执行结果的取消;isDone用于判断是否完成;get用于获取callable的返回值,set用于结果设置。所以,当我们需要获取返回值的时候,直接利用get方法即可,注意使用get方法会直接阻塞线程,直到获取到对应的结果:

main函数改写为:
public static void main(String[] args) {
		MyThread5<A> t1=new MyThread5<A>();
		ExecutorService pool=Executors.newSingleThreadExecutor();//创建单一线程池
		Future future=pool.submit(t1);
		try {
			BaseObject a=(BaseObject)future.get();
			System.out.println("str="+a.str);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

结果输出:

MyThread5的call方法执行
str=This is A.

事实上,Future只是一个抽象接口(public abstract interfacejava.util.concurrent.Future),真正实现的类是FutureTask<T>。FutureTask的声明为

public class java.util.concurrent.FutureTask implements java.util.concurrent.RunnableFuture

,可以看出实现了RunnableFuture接口,而RunnableFuture又继承了Runnable 、Future接口

public abstract interface java.util.concurrent.RunnableFuture extends java.lang.Runnable,java.util.concurrent.Future

故拥有它们两者的特点,因此,FutureTask既可以和Runnable一样,通过Thread封装执行,也可以交给线程池来执行。

public class ThreadDemo6 {
	
	public static void main(String[] args) {
		FutureTask<String> ft=new FutureTask<String>(new Callable(){
			@Override
			public Object call() throws Exception {
				return "FutureTask 返回值";
			}
			
		});
		ExecutorService pool=Executors.newSingleThreadExecutor();
		pool.submit(ft);
		try {
			System.out.println(ft.get());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

执行结果:

FutureTask 返回值


swupdate-签名验证 swupdate加密部分具体在中可以查看。 阅读详情

相关推荐

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 394

Java线程的创建及使用

本篇主要是对线程的创建、同步、使用进行说明。观看完本篇,我们应该熟知创建多线程的几种方式,及它们是如何创建,如何使用的。

qq_56826539的博客 1470

使用TensorFlow Lite Micro流程记录(带源码)

记录如何使用tensorflow lite micro,以及期间解决的问题

ZhaoDongyu_AK47的博客 6217

Java中Thread类的基本用法

Java中的Thread类的基本使用

m0_67683346的博客 6338

Elasticsearch 8.17.1 JAVA工具类

整理了Elasticsearch8.17最新版的API工具类

weixin_39555954的博客 1125

SOPHGO SG2000/SG2002 AI SoC异构架构解析与应用

异构计算架构通过整合不同指令集核心(如RISC-V、Arm和8051)实现性能与功耗的平衡,是现代嵌入式系统和AIoT设备的关键技术。其原理是根据任务特性分配至最适合的计算单元,例如通用计算使用高性能核心,实时任务交由专用核心处理。这种架构在智能视觉、工业检测等场景具有显著优势,能高效处理AI推理、多媒体编解码等任务。SOPHGO SG2000系列SoC采用创新的三核异构设计,集成了0.5-1TOPS的NPU加速器,支持Linux/Android/FreeRTOS多系统并行运行。开发中需注意核心间的IPC通

weixin_30684743的博客 355

Java 线程的使用

尚硅谷学习笔记

weixin_53472653的博客 3655

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置(附eNSP源文件)

【eNSP 华为模拟器】小型校园网模拟环境的设计与配置 一、实验概述 二、交换机的配置 2.1 二层交换机的配置 2.2 三层交换机的配置 三、路由器的配置 四、实验结果 五、实验总结 一、实验概述 按照以下的拓扑连接,自行设计VLAN和IP地址等网络参数,实现PC1到PC2的IP通信。其中,R1,R2为路由器;LSW1,LSW4为3层交换机;LSW2,LSW3 ,LSW6, LSW7为2层交换机;CLIENT1-CLIENT12为PC机。 拓扑图 课程设计要求:(1)IP地址自行规划设计,应该清晰地

qq_43757282的博客 4万+

java线程的使用_Java 线程的基本使用

创建线程创建线程的方式有两种:继承 Thread 类实现 Runnable 接口Thread 类实现了 Runnable 接口。使用继承 Thread 类的方式创建线程时,最大的局限是不支持多继承。所以为了支持多继承,应该使用实现 Runnable 接口的方式。两种方式创建的线程在工作时是一样的,没有本质区别。第一种方式,继承 Thread 类并重写 run() 方法:public class W...

weixin_34409887的博客 275

网络速度的极致:800G & 1.6T 以太网的突破!

你好,这里是网络技术联盟站。在我们进入数据驱动的世界时,以太网的重要性日益突出。从根本上说,以太网是一种连接计算机的技术,旨在形成一个本地网,通过它,设备可以与其他设备进行通信。然而,随着时间的推移,以太网已经发展成为一种全球的数据通信系统,其速度从初始的10Mbit/s发展到现在的800G,甚至1.6T。这种巨大的进步并不是没有挑战的,但每一次的突破都代表了技术的巨大飞跃。本文将探讨800G和1.6T以太网的创新与挑战。

网络技术联盟站 1773

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5525

Java线程基本使用

例子: ArmyRunnable.java public class ArmyRunnable implements Runnable { //volatile保证了线程可以正确的读取其他线程写入的值 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning){

Ben的博客 366

Linux脚本实战之SSH执行远端脚本

Linux脚本实战之SSH连接主机

jks212454的博客 2135

Java——多线程基本使用(二)

在学习多线程时,如果联系操作系统来学习,会觉得很好理解。因为学习操作系统时候,有同步,互斥,锁的一些概念~ 给个链接到上一篇~https://blog.youkuaiyun.com/zoweiccc/article/details/83002176 8.加入线程       (1)join,当前线程暂停,等待指定的线程执行结束后,当前线程再继续       (2)join(int),可以等待指定的毫秒...

没有标题 237

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 线程的基本API使用和分析(二)

今天我们通过代码分析java线程: 一、java 天生支持多线程 1、main 方法模拟一个多线程: 一个 Java 程序从 main()方法开始执行,然后按照既定的代码逻辑执行,看 似没有其他线程参与,但实际上 Java 程序天生就是多线程程序,因为执行 main() 方法的是一个名称为 main 的线程。 2、代码如下: /** *类说明:只有一个main方法的程序 */ public class OnlyMainTest { public static void ma

nandao158的博客 268

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Java并发编程四】线程的基本使用二

一个例子为有一个线程调用了大量的cpu资源去给线程a运算一个一亿的for循环语句,和一个一百的for循环语句,这样相比cpu会给极大的资源给线程a运算第一个for,但当其运算完成后,第二个for想必不用调用这么多cpu资源去运算,那么便可以使用线程谦让,使得它们再次平衡下来。即使在被synchronize包围时,stop方法也会先去释放锁,再去停止整个线程的,这样在释放锁的过程中,可能会出现一释放锁,该锁立马被别的线程锁获取,并发生了修改对象操作后,便停止了线程,这种数据错误不容易在众多代码出找出来。

Infinity的博客 244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java多线程基础(二)--java多线程的基本使用

java多线程的基本使用 在java中使用多线程,是通过继承Thread这个类或者实现Runnable这个接口或者实现Callable接口来完成多线程的。 下面是很简单的例子代码: package com.ming.thread.one; public class OneWay extends Thread{ public void run(){ ...

weixin_34195364的博客 83

【Java】线程基本使用——实现 Runnable接口

实现 Runnable 接口 说明 java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。 java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程 应用案例 请编写程序,该程序可以每隔1秒。在控制台输出“hi!”,当输出10次后,自动退出。 请使用实现Runnable接口的方式实现。这里底层使用了设计模式【代理模式】=> 代码模拟实现Runnable接口 开发线程的机制。 ...

兮动人 2万+

【Java多线程】线程的基本使用

Java线程的基本使用

weixin_62533201的博客 966

java并发编程二 Java 线程的基本概念

当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束.程序在 t1 线程运行,FileReader.read() 方法调用是异步的。打断 sleep 的线程, 会清空打断状态,以 sleep 为例。

个人博客,记录了本人学习的各种有趣的技术。 3038

java线程篇-线程基本使用方法

题外话,最近看了本java多线程编程核心技术,有做了一次安卓的项目开发,在安卓中那些乱糟糟的线程最后我也不知道是怎么把他们弄得能运行的,玄学啊 ,安卓的线程真的不能在吐槽了,总之,因为这些原因,我准备写7篇左右的java线程方面知识,当然每篇内容不会太多了,毕竟线程知识量其实不大,这篇是基础论,稍微懂线程的就可以跳过了,谢谢。 首先,java的线程其实有4中创建方式,但是有2种非常偏,几乎没人用,...

weixin_43486804的博客 1万+

线程的基本使用

Java是单继承的,如果一个类A已经继承了类B,这是就无法让类A再去继承THread了,所以还有方法2----实现Runnable接口,底层使用了代理模式。当一个线程在对某些数据进行操作时,其他线程都不可以对这些数据进行操作,直到该线程完成操作,其他线程才能对这些数据进行操作。守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束,垃圾回收机制就是各典型的守护线程。5、同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)6、同步方法(静态的)的锁为当前类本身。

qq_41386300的博客 848

Java基础之线程池基本使用

1.线程池类为java.util.concurrent.ThreadPoolExecutor, 常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) 2.使用线程池的好处: 降低资源消耗:通过重复利用已..

u012556114的博客 420

二、Java线程

方法1 是把线程和任务合并在一起, 方法2 是把线程和任务分开了用Runnable 更容易与线程池等高级API 配合用 Runnable 让任务类脱离了Thread 继承体系,更灵活sleep 调用是进入等待阻塞状态, cpu时间片不会分配给阻塞状态的线程,需要等到他醒过来进入就绪状态。yield 调用是进入 就绪 状态, cpu 是会将时间片分配给就绪状态的线程, 也就是说如果没有其他线程,这时候yield 也就是没让出去。

yuigjjhgjh的博客 1186

Java 多线程基本使用

文章目录Java 多线程基本使用进程与线程区别多线程的创建继承Thread类实现Runnable接口实现Callable接口run()与start()的区别基本使用currentThread()join()sleep()yieldwait() & notify & notifyAll()wait与sleep区别守护线程优雅中断线程interrupt()自定义变量线程同步问题不加锁synchronizedvolatileLock线程安全的集合Collectionsjava.util.concu

xiangxiongfly 674

java学习——线程基本使用

他们都实现了同一个接口,我们在实现被代理类的时候,我们不直接调用,而是转到代理类里面,去实现,当然我们最后调用的还是被代理类的方法,但是我们可以用代理类对方法进行处理。我们用T1,T2两个类去分别实现两个线程的创建,子线程的创建我们用的是实现Runnable接口来创建,然后我们在main主线程里面启动两个子线程。上面的代码我们有三个步骤,第一重写了run方法,第二在run方法里面我们使用了Thread.sleep方法做延迟,第三在我们调用这个线程的时候,我们底层使用的是start0()方法。

m0_73245690的博客 1210
上一篇: Java线程的基本使用
下一篇: Java线程池的使用
ZGUIZ
博客等级 码龄10年 106粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值