Java 创建线程的3种方法及各自优势
1. 继承 Thread 类,然后调用 start 方法。
class MyThread extends Thread {
//重写run方法,线程运行后,跑的就是run方法
public void run(){
//System.out.println("");
}
public static void main(String[] args){
Thread t1 = new MyThread();
t1.start(); //线程运行,调用的 run()方法.
}
}
2. 实现 Runnable 接口的 run 方法, 然后再用 Thread 类包裹后,调用 start 方法。
class TestThread implements Runnable{
@Override
public void run() {
// implement run method here
//System.out.println("");
}
public static void main() {
final TestThread obj = new TestThread();
Thread t1 = new Thread(obj);
t1.start();
}
}
3. 实现 Callable 接口的 call 方法,用 FutureTask 类包裹 Callable 对象。然后再用 Thread 类包裹 FutureTask 类,并调用 start 方法。call() 方法可以有返回值。
class MyCallable implements Callable {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) throws Exception {
MyCallable mc = new MyCallable(); //实例化 callable
FutureTask oneTask = new FutureTask(mc); //用FutureTask包裹
Thread oneThread = new Thread(oneTask); //用Thread包裹
oneThread.start();
System.out.print(oneTask.get()); //获取返回值
}
}
Callable 方法在 Java 8 后,支持拉姆达表达式的写法,可以创建一个 FutureTask 类,语句上不是太罗嗦。 Callable 方式有以下几个优点:
- 可以捕获线程上的异常。
- 可以通过 get 方法得到返回值。
- get 方法阻塞当前线程,直到调用的线程运行结束。
- 可以取消线程的运行。
下面代码演示了使用 FutureTask 类运行线程,捕获异常的例子:
FutureTask<Integer> task=new FutureTask<Integer>(()->{
throw new Exception("自定义异常");
});
new Thread(task).start();
try {
System.out.println(task.get());
} catch (Exception e) {
System.out.println(e.getMessage());
}
Java 6 之后,还可以通过创建线程池来创建线程,使用 ExecutorService 的 execute 方法:
ExecutorService es = Executors.newCachedThreadPool();
Runnable r = <your runnable here>;
es.execute(r);
实现Runnable接口相对于继承Thread类的优势:
(1) 适合多个相同程序代码的线程去处理同一资源的情况
(2) 可以避免由于java单一继承带来的局限性
(3) 用接口的方式将你的代码和线程实现分离,更加清晰。
(4) 通过继承Thread类,每个线程都有一个相关联的唯一对象,而实现Runnable接口,多线程可以共享同一个Runnable实例。
(5) 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
Java 创建线程的3种方法及各自优势的更多相关文章
- java创建线程的三种方法
这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...
- java创建线程的四种方法
第一种: 通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runna ...
- Java 创建线程的两种方法
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- Java创建线程的两种方法
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- java 创建线程的三种方法Callable,Runnable,Thread比较及用法
转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread, ...
- Java创建线程的三种方法比较
一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别 (1)Callable规定的方法是call(),Runnable规定的方法是run(). ...
- 区分JAVA创建线程的几种方法
1. start()和run() 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行.然后 通过此Thread类调用方法run()来完成其运行操 ...
- Java新建线程的3种方法
Java新建线程的3种方法 =================== Java创建线程有3种方法:(1)继承Thread;(2)实现Runnable接口:(3)实现Callable接口; 由于Java只 ...
- 《Java多线程面试题》系列-创建线程的三种方法及其区别
1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...
随机推荐
- Java中Object类常用的12个方法,你用过几个?
前言 Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的“老祖宗”.Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承所有 Object ...
- 你不会还在用这8个错误的SQL写法吧?
1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...
- ELK输出nginx的日志(未完成)
我们先准备3台centos7服务器 171 做 elasticsearch,kibana的操作 172 做logstash 的操作 173 做nginx 的操作 软件 版本号 elasticsearc ...
- EFK的搭建(未完成)
EFK 是ELK 日志分析的一个变种,能够更好的来实现日志分析. 首先我们先准备3台 centos7的服务器,在给他们调成2核2G的状态打开. 软件 版本号 zookeeper 3.4.14 Kafk ...
- SSH框架搭建详细图文教程
转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6762554.html 一.什么是SSH? SSH是JavaEE中三种框架(Struts+Spring+H ...
- 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3
编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...
- 想要入行web前端要知道web前端的的基本工作职责
入一行,要先知一行 ”:我们来看看web前端开发职位 无论什么门派都要做到的一些基本工作职责 首先,你必须是一个合格的“页面仔”,这个叫法不好听,但很生动: 我们都知道,所有呈现的内容都是基于HTML ...
- UiPath Read CSV 中文乱码
问题:UiPath 读取.CSV文件时,出现中文乱码. 解决1: 修改CSV文件的编码为UTF-8 解决2: 设置Read CSV Activity的 encoding属性为csv相应的编码格式 参考 ...
- git 常用操作汇总
1. 如何查看当前分支是从哪个分支创建来的? git reflog --date=local 当前分支名称 2. 查看当前分支 git branch 当前分支前面会显示 * 号 3.切换到某个分支 ...
- MongoDB安装与Spring整合
MongoDB是面向文档的非关系型数据库,数据模型是一种类似于JSON的结构,在数据库中存的是各种各样的JSON.官网下载地址:https://www.mongodb.com/download-cen ...