java多线程-创建线程
大纲:
- Thread创建线程。
- Runnable接口。
- Callable接口。
- 小结
一、java创建线程--继承Thead类
创建一个类继承Thead类,并重写run方法。
class Test {public static void main(String[] args) {System.out.println("当前线程:"+Thread.currentThread());new TestThread().start();new TestThread().start();}static class TestThread extends Thread {@Overridepublic void run() {System.out.println("当前线程:"+Thread.currentThread());}} }/**运行结果:当前线程:Thread[main,5,main]当前线程:Thread[Thread-0,5,main]当前线程:Thread[Thread-1,5,main]*/
二、java创建线程--实现Runnable接口
创建一个类实现Runnable接口,并重写run方法。
class Test {public static void main(String[] args) {System.out.println("当前线程:"+Thread.currentThread());new Thread(new TestThread()).start();new Thread(new TestThread()).start();}static class TestThread implements Runnable {@Overridepublic void run() {System.out.println("当前线程:"+Thread.currentThread());}} }/** 运行结果:当前线程:Thread[main,5,main]当前线程:Thread[Thread-0,5,main]当前线程:Thread[Thread-1,5,main]*/
三、java创建线程--实现Callable接口
Callable接口中只有一个call方法,任务写在call方法中,与Runnable不同的是,任务执行完成后Callable返回执行结果,也可以抛出任务执行时的异常。
public interface Callable<V> {V call() throws Exception; }
Futrue接口共5个方法
- cancel取消任务,参数表示是否中断正在执行的任务。(1)任务没有开始或正在执行,返回true 。(2)任务执行完成,返回false。
- isCancelled:任务非正常执行完成,执行了cancel方法返回true。
- isDone:任务正常执行完成或任务执行了cancel都返回true。
- get:方法阻塞至任务执行完毕,返回执行结果,当任务执行报错时可以通过任务中抛出的ExecutionException拿到异常信息。
- 带参get:可以设置超时时间,任务执行超时,抛出TImeoutException。
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
RunnableFuture接口实现了Runnable和Future接口
public interface RunnableFuture<V> extends Runnable, Future<V> {void run(); }
RunnableFuture接口有一个实现类FutureTask,FutureTask的构造函数接收一个Callable任务,又继承了Future接口,因此执行FutureTask任务可以拿到执行结果。
public class TestCallable {public static void main(String[] args) {System.out.println("start");//执行任务FutureTask<String> task = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(1000);return "success";}});new Thread(task).start();//接收线程运算后的结果try {long start = System.currentTimeMillis();System.out.println("任务执行结果:" + task.get());//get为阻塞方法,阻塞至任务执行结束long end = System.currentTimeMillis();long process = end - start;System.out.println("任务执行了:" + process + "毫秒");} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}System.out.println("end");} }/**运行结果:start任务执行结果:success任务执行了:1018毫秒end*/
小结:
- Thread类中start方法首先为线程的执行准备好系统资源,然后再去调用run方法,因此run方法不需要我们手动调用。
- Thread和Runnable方式执行任务都无法在主线程中获取任务的执行结果,Callable执行任务可以获取执行结果,执行结果通过Future的get方法获取。
- Thread和Runnable方式执行任务都无法在主线程中获取任务执行的异常信息,Callable执行任务可以通过Future中的get方法抛出异常。
- 这些执行的任务的线程都是被主线程创建出来的子线程。
转载于:https://www.cnblogs.com/liuboyuan/p/9945652.html
java多线程-创建线程相关推荐
- java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- Java多线程:线程安全和非线程安全的集合对象
转载自 Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...
- java 多线程使用线程池_Java多线程:如何开始使用线程
java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- JAVA中创建线程的三种方法及比较
JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...
- Java中创建线程的三种方式
Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)继承Thread类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. ...
- java多线程之线程池简介
前言 池化技术已经屡见不鲜了,比如数据库连接池,大家的项目中应该也用到了线程池.池化技术的好处:降低资源的消耗,提高响应速度,提高线程的可管理性.本篇主要是和大家一起分析下线程池的架构和它的工作流程. ...
最新文章
- 什么是OKR?这就是OKR
- Java Array 常见报错
- Java的多线程和线程池的使用,你真的清楚了吗?
- Android-用ListView显示SDCard文件列表
- 【c语言数据结构笔记】1.2 数据结构
- Linux 29岁,你不知道的29个重大事件
- 自定义Sublime Text图标详细教程
- 服务器安装系统的工具,工具集#08 服务器安装系统指南
- 一加屏幕检测代码_一加7Pro深度体验:亿元屏幕真曲面
- 【转】图片轮播效果2
- PDE13 Wave equation: separation of variables
- ViewPager使用记录2——展示动态数据
- shell脚本获取mysql插入数据自增长id的值
- jquery 分页插件
- 为什么Audition CC2017扫描不了电音插件,你需要这个工具
- 如何用informatic实现表的增量抽取
- 英式和美式的单词拼写差异详细对照表
- siblings筛选同胞元素
- 大数据在各领域应用之精准营销
- Turtlebot3 buger在仿真环境下建图导航
热门文章
- paip.超实用 360浏览器最近频繁奔溃解决流程.
- paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
- python: 动态网页playwright 爬虫实践
- 毕设题目:Matlab智能算法TSP(旅行商)
- 【协同任务】基于matlab多无人机目标搜索与围捕【含Matlab源码 1205期】
- 【模拟信号】基于matlab调相信号产生+解调【含Matlab源码 987期】
- 【路径规划】基于matlab动态多群粒子群算法局部搜索路径规划【含Matlab源码 448期】
- 【数字信号】基于GUI数字波束算法库【含Matlab源码 313期】
- 【路径规划】基于matlab人工势场算法多机器人协同编队避障路径规划【含Matlab源码 1192期】
- SPSS调节效应检验(图文+数据集)【SPSS 045期】