Java8——三种多线程方式
2019独角兽企业重金招聘Python工程师标准>>>
1、多线程的使用方式
1.1、继承Thread类
继承Thread并重写run()方法,Thread类中的start方法会去调用系统的方法执行相应的线程。实际上Thread也是实现了Runable接口的,从该类的文档中我们能找到。
1.2、实现Runable接口
实现Runable接口,并重写run()方法,启动线程必须要使用Thread类的start()方法。
1.3、实现Callable接口
实现Callable接口的代码例子:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /** *//** * Callable 和 Future接口 * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。 * Callable和Runnable有几点不同: * (1)Callable规定的方法是call(),而Runnable规定的方法是run(). * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。 * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。 * (4)运行Callable任务可拿到一个Future对象, * Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。 * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。 */
public class CallableAndFuture { /** *//** * 自定义一个任务类,实现Callable接口 */ public static class MyCallableClass implements Callable{ // 标志位 private int flag = 0; public MyCallableClass(int flag){ this.flag = flag; } public String call() throws Exception{ if (this.flag == 0){ // 如果flag的值为0,则立即返回 return "flag = 0"; } if (this.flag == 1){ // 如果flag的值为1,做一个无限循环 try { while (true) { System.out.println("looping."); Thread.sleep(2000); } } catch (InterruptedException e) { System.out.println("Interrupted"); } return "false"; } else { // falg不为0或者1,则抛出异常 throw new Exception("Bad flag value!"); } } } public static void main(String[] args) { // 定义3个Callable类型的任务 MyCallableClass task1 = new MyCallableClass(0); MyCallableClass task2 = new MyCallableClass(1); MyCallableClass task3 = new MyCallableClass(2); // 创建一个执行任务的服务 ExecutorService es = Executors.newFixedThreadPool(1); try { // 提交并执行任务,任务启动时返回了一个 Future对象, // 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作 Future future1 = es.submit(task1); // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行 System.out.println("task1: " + future1.get()); Future future2 = es.submit(task2); // 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环 Thread.sleep(5000); System.out.println("task2 cancel: " + future2.cancel(true)); // 获取第三个任务的输出,因为执行第三个任务会引起异常 // 所以下面的语句将引起异常的抛出 Future future3 = es.submit(task3); System.out.println("task3: " + future3.get()); } catch (Exception e){ System.out.println(e.toString()); } // 停止任务执行服务 es.shutdownNow(); }
}
2、线程同步
2.1、同步代码块
synchronized("锁"){ //在这里锁通常有两种,一种是字符串常量,另外一种是this
//需要同步执行的代码块
}
2.2、同步方法
public synchronized void xxx(){
//同步方法
}
3、总结
3.1、所有线程的启动都必须调用Thread类中的start()方法
new Thread("线程名字").start();
3.2、实现Runable是首先应该考虑的方法,有下面的两点原因
- 在Java中继承类具有局限性,每个类只能继承一个类,但是能实现多个接口
- 实现Runable接口能更好的共用数据
- 实现Callable能返回值(其它两个方法,在线程结束之后不能返回值)
转自:
https://blog.csdn.net/jpzhu16/article/details/53326506
https://my.oschina.net/rouchongzi/blog/129333
本文进行了新的排版,文字信息主要来自于上述链接。
转载于:https://my.oschina.net/watsonos/blog/1807910
Java8——三种多线程方式相关推荐
- java多线程实现表复制_Java多线程的三种实现方式
今天简单说一下Java三种多线程实现方式和区别,主要有实现Runnable.Callable和继承Thread三种方式. 实现Runnable的方式 这种方式比较常用,当我们的线程类有继承其他的类的情 ...
- Java多线程的三种实现方式(重点看Collable接口实现方式)
1.通过继承Thread类来实现多线程 在继承Thread类之后,一定要重写类的run方法,在run方法中的就是线程执行体,在run方法中,直接使用this可以获取当前线程,直接调用getName() ...
- Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题
Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...
- 分布式锁简单入门以及三种实现方式介绍(滴滴)
很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...
- 线程的三种创建方式以及代码实现
线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...
- memcached 分布式锁 java_分布式锁的三种实现方式
分布式锁的三种实现方式 一.zookeeper 1.实现原理: 基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来自于IBM网站).大致思想即为:每个客户端对某个功能加锁时,在z ...
- iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- 线程的三种创建方式和他们的优缺点
文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...
- Spring 的三种注入方式,到底哪种注入方式最佳?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...
最新文章
- 温度单闭环实验计算机控制,过程控制系统实践指导简介,目录书摘
- 实战tkinter图形界面开发_如何进行简单的图形开发?
- (转)WCF教程系列(1)-创建第一个WCF程序
- 【线段树】海报(loj 3264)
- 重复运行JUnit测试而没有循环
- [Leetcode][第5458题][JAVA][字符串的好分割数目][双指针][HashSet]
- Leetcode 杂题
- idea没有代码自动提示功能和包自动引入不了问题
- Java基础学习总结(126)——Log4j2.xml生产环境实用配置
- java就业班学什么呀_传智播客JAVA就业班学习心得
- Xshell连接centOS7与CentOS7联网——一步到位
- linux 锐捷客户端 脚本,常熟理工学院锐捷客户端 for Linux
- 自适应迁移学习核极限学习机KELM用于分类
- linux怎么生成arm文件,Linux下ffmpeg转换工具配置(MP3和AMR格式文件互转).docx
- 苹果12可以双开微信吗 iPhone 12双开微信教程「iphone技巧」
- html4角星,运用ai绘画出5角星4角星三角形形状的设置步骤
- org.springframework.util.AntPathMatcher:URL 与 匹配规则
- APM时代的质量保障之路:腾讯互娱品质管理部性能负责人访谈
- 炼数成金 mysql_MySQL DBA从小白到大神实战 MySQL运维DBA课程 炼数成金MySQL企业运维视频教程...
- java计算机毕业设计自考学位系统源程序+mysql+系统+lw文档+远程调试
热门文章
- tensorflow 加载下载波士顿房价数据集
- 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
- LeetCode 905	 Sort Array By Parity--Java stream,Python lambda表达式一行 解法
- miui12 android版本,miui12基于安卓几版本开发的?miui12是安卓11吗
- java list键值_java基础之对List,Map,Set等集合键值对的简单认识
- 【RocketMQ工作原理】消息的清理
- Mac上Homebrew的使用
- matlab实现周期阶跃函数,连续时间信号傅利叶变换与MATLAB实现.doc
- java webservice接口开发_php开发webservice服务端接口(wsdl)
- 手把手教你使用 Python 制作贪吃蛇游戏