面试官:小伙子,说一说Java多线程有哪些创建方式吧
第一种 继承Thread类
自定义类,继承Thread类,并重写run()方法.
class MyThread1 extends Thread {
@Override
public void run() {
System.out.println("第一种方式Thread " + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) throws Exception {
//第一种方式
MyThread1 thread1 = new MyThread1();
thread1.start(); MyThread1 thread1 = new MyThread1();
thread1.start(); MyThread1 thread2 = new MyThread1();
thread2.setName("zz");
thread2.start();
// 运行结果
// 第一种方式Thread Thread-0
// 第一种方式Thread Thread-1
// 第一种方式Thread zz
// 若不指定Name属性,能默认计数器0,1,2,3,4,5
}
}
第二种 实现Runnable接口
自定义类,实现Runnable接口的run方法. since JDK1.0
class MyThread2 implements Runnable {
@Override
public void run() {
System.out.println("第二种方式Runnable " + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) throws Exception {
//第二种方式
Thread thread2 = new Thread(new MyThread2());
thread2.start();
// Lambda表达式方式->因为Runnable被注解FunctionalInterface标识表明该接口是一个函数式接口
new Thread(() -> {
System.out.println("第二种方式Runnable_Lambda " + Thread.currentThread().getName());
}).start();
// 运行结果
// 第二种方式Runnable Thread-0
// 第二种方式Runnable_Lambda Thread-1
}
}
第三种 实现Callable接口
已知Runnable的run方法无返回值,所以引入了有返回值的Callable接口
since JDK1.5
FutureTask中构造方法如下.
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
FutureTask类结构图如下.
因为FutureTask类实现了Runnable接口,所以线程实现方法如下.
public class Test {
public static void main(String[] args) throws Exception {
//第三种方式
FutureTask<String> thread3 = new FutureTask<>(new MyThread3());
new Thread(thread3).start();
System.out.println(thread3.get()); //获得回调值 FutureTask<String> thread4 = new FutureTask(()->{
System.out.println("Call");
return "Lambda回调";
});
new Thread(thread4).start();
System.out.println(thread4.get());
// 运行结果
// 第三种方式Callable Thread-0
// 回调
// Call
// Lambda回调
}
}
class MyThread3 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("第三种方式Callable " + Thread.currentThread().getName());
return "回调";
}
}
第四种 线程池
交付线程池两种方式 submit或者execute方法,前者可接受Callable接口对象,有返回值,后者无返回值
public class Test {
public static void main(String[] args) throws Exception {
//第一种方式
MyThread1 thread1 = new MyThread1();
thread1.start();
//第二种方式
Thread thread2 = new Thread(new MyThread2());
thread2.start();
//第三种方式
FutureTask<String> thread3 = new FutureTask<>(new MyThread3());
new Thread(thread3).start();
System.out.println(thread3.get());
//第四种方式
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<?> submit1 = pool.submit(new MyThread1());
Future<?> submit2 = pool.submit(new MyThread2());
Future<?> submit3 = pool.submit(new MyThread3());
System.out.println(submit1.get() + " " + submit2.get() + " " + submit3.get());
pool.shutdown();
// 运行结果
// 第一种方式Thread Thread-0
// 第二种方式Runnable Thread-1
// 第三种方式Callable Thread-2
// 回调
// 第一种方式Thread pool-1-thread-1
// 第二种方式Runnable pool-1-thread-2
// 第三种方式Callable pool-1-thread-3
// null null 回调
} }
特点
无论何种方式,都要使用Thread类中start方法开始多线程.
Runnable接口和Callable接口区别,后者可返回参数,参数类型Object.
线程池避免了线程频繁使用的创建和释放操作.
看完有什么不懂的欢迎在下面留言评论!
面试官:小伙子,说一说Java多线程有哪些创建方式吧的更多相关文章
- Java多线程——线程的创建方式
Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...
- 阿里面试官:你连个java多线程都说不清楚,我招你进来干什么
创建线程的方法 继承Thread类 继承Thread类,重写run方法,通过线程类实例.start()方法开启线程. public class TestThread1 extends Thread{ ...
- java 多线程5(创建方式)
实现Runnable接口: 问题1:Runnable实现类的对象是线程对象吗? 答:不是,该对象只不过是实现了Runnable接口的对象而已,只有是Thread或Thread的子类才是线程对象. 问题 ...
- Java:多线程概述与创建方式
目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...
- 大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)
大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式) 现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法.一 ...
- 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?
我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...
- 引用面试官文章 :如何准备Java初级和高级的技术面试
本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...
- 一张图,让你和面试官聊一个小时的“Java内存模型”
如果面试官问你:你了解 Java 内存模型吗? 你就可以使用这张图,按照这张图中的顺序和面试官开聊,正常情况下,聊一个小时是差不多的,这个时候,对你的处境是非常有益的,因为面试官的时间不多了.
- 面试官:兄弟,说说Java到底是值传递还是引用传递
二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...
随机推荐
- java 保留小数点后指定位数四种方法
1 package com.itheima_01; 2 3 import java.math.BigDecimal; 4 import java.text.DecimalFormat; 5 impor ...
- Vue踩坑日记-Element this.$message 找不到模块
在使用Vue.js的 Element框架时,无法使用Message组件 浏览器提示:找不到组件 原始写法: this.$message({ message: '恭喜你,这是一条成功消息', type: ...
- 使用PL/SQL Developer 学习pl/sql
1.创建表并且插入一些数据 (这里表名为test): 2. New 一个SQL Window敲下如下代码(--为注释部分): declare --declare:用于plsql中的声明变量,和be ...
- 【CF1436C】Binary Search 题解
原题链接 题意简介 要求有多少种 n 的排列,能够通过二分法正确地找到放在 pos 处的数字 x. 答案对 1e9+7 取模.n<=1000. 采用的二分法如下图: 思路分析 首先,这个排列中有 ...
- vue自定义指令 默认图片
/** * 检测图片是否存在 * @param url */ function imageIsExist(url) { return new Promise((resolve) => ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- Luogu P4643 阿狸和桃子的游戏
题解 传送门 既然题目要求的是差值 所以对于减数和被减数同时加上一个相同的数是毫无影响的 (详情参考人教版六年级上册数学教材) 所以不妨把边权分成两半 分别加给两个顶点 然后,直接每次选最大的点就好了 ...
- 《Clojure编程》笔记 第4章 多线程和并发
目录 背景简述 第4章 多线程和并发 4.0 我的问题 4.1 术语 4.1.1 一个必须要先确定的思考基础 4.2 计算在时间和空间内的转换 4.2.1 delay 4.2.2 future 4.2 ...
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
- Java基础系列-单例的7种写法
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755322.html 一.概述 Java中单例有7种写法,这个是在面试中经常被问到的内容,而且有时候 ...