大纲:

  1. Thread创建线程。
  2. Runnable接口。
  3. Callable接口。
  4. 小结

一、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个方法

  1. cancel取消任务,参数表示是否中断正在执行的任务。(1)任务没有开始或正在执行,返回true 。(2)任务执行完成,返回false。
  2. isCancelled:任务非正常执行完成,执行了cancel方法返回true。
  3. isDone:任务正常执行完成或任务执行了cancel都返回true。
  4. get:方法阻塞至任务执行完毕,返回执行结果,当任务执行报错时可以通过任务中抛出的ExecutionException拿到异常信息。
  5. 带参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*/

小结:

  1. Thread类中start方法首先为线程的执行准备好系统资源,然后再去调用run方法,因此run方法不需要我们手动调用。
  2. Thread和Runnable方式执行任务都无法在主线程中获取任务的执行结果,Callable执行任务可以获取执行结果,执行结果通过Future的get方法获取。
  3. Thread和Runnable方式执行任务都无法在主线程中获取任务执行的异常信息,Callable执行任务可以通过Future中的get方法抛出异常。
  4. 这些执行的任务的线程都是被主线程创建出来的子线程。

转载于:https://www.cnblogs.com/liuboyuan/p/9945652.html

java多线程-创建线程相关推荐

  1. java多线程 -- 创建线程的第三者方式 实现Callable接口

    Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一 ...

  2. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  3. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  4. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  5. Java多线程:线程安全和非线程安全的集合对象

    转载自  Java多线程:线程安全和非线程安全的集合对象 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到 ...

  6. java 多线程使用线程池_Java多线程:如何开始使用线程

    java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...

  7. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  8. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...

  9. Java中创建线程的三种方式

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)继承Thread类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. ...

  10. java多线程之线程池简介

    前言 池化技术已经屡见不鲜了,比如数据库连接池,大家的项目中应该也用到了线程池.池化技术的好处:降低资源的消耗,提高响应速度,提高线程的可管理性.本篇主要是和大家一起分析下线程池的架构和它的工作流程. ...

最新文章

  1. 什么是OKR?这就是OKR
  2. Java Array 常见报错
  3. Java的多线程和线程池的使用,你真的清楚了吗?
  4. Android-用ListView显示SDCard文件列表
  5. 【c语言数据结构笔记】1.2 数据结构
  6. Linux 29岁,你不知道的29个重大事件
  7. 自定义Sublime Text图标详细教程
  8. 服务器安装系统的工具,工具集#08 服务器安装系统指南
  9. 一加屏幕检测代码_一加7Pro深度体验:亿元屏幕真曲面
  10. 【转】图片轮播效果2
  11. PDE13 Wave equation: separation of variables
  12. ViewPager使用记录2——展示动态数据
  13. shell脚本获取mysql插入数据自增长id的值
  14. jquery 分页插件
  15. 为什么Audition CC2017扫描不了电音插件,你需要这个工具
  16. 如何用informatic实现表的增量抽取
  17. 英式和美式的单词拼写差异详细对照表
  18. siblings筛选同胞元素
  19. 大数据在各领域应用之精准营销
  20. Turtlebot3 buger在仿真环境下建图导航

热门文章

  1. paip.超实用 360浏览器最近频繁奔溃解决流程.
  2. paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
  3. python: 动态网页playwright 爬虫实践
  4. 毕设题目:Matlab智能算法TSP(旅行商)
  5. 【协同任务】基于matlab多无人机目标搜索与围捕【含Matlab源码 1205期】
  6. 【模拟信号】基于matlab调相信号产生+解调【含Matlab源码 987期】
  7. 【路径规划】基于matlab动态多群粒子群算法局部搜索路径规划【含Matlab源码 448期】
  8. 【数字信号】基于GUI数字波束算法库【含Matlab源码 313期】
  9. 【路径规划】基于matlab人工势场算法多机器人协同编队避障路径规划【含Matlab源码 1192期】
  10. SPSS调节效应检验(图文+数据集)【SPSS 045期】