面试题:创建多线程有有哪几种方式?

回答:4种。

  • 实现Runnable接口(重写Run方法)
  • 继承Thread
  • 实现Callable接口(重写Call方法,与Run不同的是,Call方法有返回值)
  • 使用线程池

JDK5.0新增创建线程方式一:实现Callable接口


package com.atguigu.java2;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** 创建线程的方式三:实现Callable接口。 --- JDK 5.0新增** 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?* 1. call()可以有返回值的。* 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息* 3. Callable是支持泛型的**/
//1.创建一个实现Callable的实现类
class NumThread implements Callable {//2.实现call方法,将此线程需要执行的操作声明在call()中@Overridepublic Object call() throws Exception {int sum = 0;for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {System.out.println(i);sum += i;}}return sum;}
}public class ThreadNew {public static void main(String[] args) {//3.创建Callable接口实现类的对象NumThread numThread = new NumThread();//4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象FutureTask futureTask = new FutureTask(numThread);//5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()new Thread(futureTask).start();try {//6.获取Callable中call方法的返回值(如果对call方法的返回值不感兴趣,就不需要调用futureTask.get()方法)//get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。Object sum = futureTask.get();System.out.println("总和为:" + sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

方式二:使用线程池

package com.atguigu.java2;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;/*** 创建线程的方式四:使用线程池** 好处:* 1.提高响应速度(减少了创建新线程的时间)* 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)* 3.便于线程管理* corePoolSize:核心池的大小* maximumPoolSize:最大线程数* keepAliveTime:线程没有任务时最多保持多长时间后会终止** 面试题:创建多线程有几种方式?四种!*/class NumberThread1 implements Runnable {@Overridepublic void run() {for (int i = 0; i <= 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + ": " + i);}}}
}class NumberThread2 implements Runnable {@Overridepublic void run() {for (int i = 0; i <= 100; i++) {if (i % 2 != 0) {System.out.println(Thread.currentThread().getName() + ": " + i);}}}
}public class ThreadPool {public static void main(String[] args) {//1. 提供指定线程数量的线程池ExecutorService service = Executors.newFixedThreadPool(10);ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;//设置线程池的属性
//        System.out.println(service.getClass());
//        service1.setCorePoolSize(15);
//        service1.setKeepAliveTime();//2.执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象service.execute(new NumberThread1());//适合适用于Runnableservice.execute(new NumberThread2());//适合适用于Runnable//        service.submit(Callable callable);//适合使用于Callable//3.关闭连接池service.shutdown();}}

【Java】线程创建方式:Callable接口 / 使用线程池相关推荐

  1. 线程创建方式3-实现 callable接口(Java)

    线程创建方式3-实现 callable接口(Java) 线程创建方式三:实现 callable接口 callable的好处: 1.可以定返回值 2.可以抛出异常 package src.Demo02; ...

  2. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  3. java并发编程实践 part 01 --gt; 线程创建方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_26654727/article/details/78013989 最近在尝试重新复习一段关于多 ...

  4. 除了Thread和Runnable,你还知道第三种创建线程的方式Callable吗

    相信大多数学过多线程的同学都知道创建线程常见的有三种方式,一种是继承Thread类,一种是实现Runnable接口,最后一种就是Callable,今天主要是对最后不常见的Callable方式进行介绍. ...

  5. 线程创建方式的三种方式

    三种线程创建方式 继承 Thread 类重写 run 方法 实现Runnable接口的run方法 使用Callable和Future创建线程 继承 Thread 类重写 run 方法 线程创建方式 创 ...

  6. 第三十三天- 线程创建、join、守护线程、死锁

    1.线程,线程创建 概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责 ...

  7. java多线程创建方式以及线程安全

    什么是线程 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位.每个程序程序都至少有一个线程,也即是程序本身. 线程的状态 新建(New):创建后尚未启动的 ...

  8. java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...

    基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...

  9. 创建线程的几种方式---最全面的创建线程方式总结---线程创建方式面试看这篇就够了

    前言:我相信创建线程的方式对于所有的java开发程序员来说都不陌生,在面试过程中这个问题也是高频考点.鉴于此,小编用本篇博文来整理几种线程的创建方式,希望对同学们有所帮助~ 文章目录 一.什么是进程? ...

最新文章

  1. 【Linux Deploy】一、Linux Deploy安装配置使用教程
  2. 常用的下载文献的地方
  3. VTK:可视化之CursorShape
  4. 《对马岛之魂》:“取巧”成功的佳作
  5. task_struct 结构如何查看及分析
  6. http中的请求头各部分都是什么意思_硬核!30 张图解 HTTP 常见的面试题
  7. Python3实现从txt文件中读取指定行的方法
  8. linux2.6 gcc 4.8.2,在Red Hat Enterprise linux 6.5上安装GCC 4.8.2
  9. 好玩的java代码 安卓_各种版本的 玩Android 来啦!
  10. Spring Boot - 开发Web应用
  11. 课程设计之图书管理系统C#实现
  12. steam授权_Epic喜+1:塔洛斯的法则|Steam上周销量榜出炉|格力折叠屏手机专利授权...
  13. spyder python下载_【spyder编程软件下载】spyder官方下载 v2.1.0 最新版-七喜软件园...
  14. Java实战之管家婆记账系统(24)——项目总结
  15. Echarts直方图
  16. uni 加入图标_uniapp如何更改图标
  17. 关于组织自定义皮肤/主题的一点思考
  18. week9 day1 HTML简介和常用标签
  19. ISO 8583协议-银行交易的标准
  20. 使用visjs制作网络拓扑图

热门文章

  1. PAT (Advanced Level) 1014 Waiting in Line(模拟)
  2. HDU - 4388 Stone Game II(博弈+思维)
  3. HDU - 6514 Monitor(二维差分)
  4. 在html怎么使用php函数,php htmlentities函数讲解及使用实例
  5. uva437The Tower of Babylon
  6. TensorFlow2-神经网络基础
  7. FFmpeg基本组成
  8. python 爬取今日头条热点新闻
  9. 为什么字节跳动选择使用 Go 语言?
  10. 新来的妹纸问我 AJAX 请求为什么不安全?没有回答出来。。。