Java中多线程的创建有几种方式?

答:四种。

创建多线程的四种方式:

继承Thread类,实现Runnable接口,jdk5.0以后又增加了两种方式,实现Callable接口和使用线程池。

方式一:继承Thread类的方式:

1. 创建一个继承于Thread类的子类
 2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中
 3. 创建Thread类的子类的对象
 4. 通过此对象调用start():①启动当前线程 ② 调用当前线程的run()

说明两个问题:
问题一:我们启动一个线程,必须调用start(),不能调用run()的方式启动线程。
问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start().

方式二:实现Runnable接口的方式:

1. 创建一个实现了Runnable接口的类
 2. 实现类去实现Runnable中的抽象方法:run()
 3. 创建实现类的对象
 4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
 5. 通过Thread类的对象调用start()

两种方式的对比:

开发中:优先选择:实现Runnable接口的方式
 原因:

  1. 实现的方式没类的单继承性的局限性
  2. 实现的方式更适合来处理多个线程共享数据的情况。

联系:public class Thread implements Runnable
 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
          目前两种方式,要想启动线程,都是调用的Thread类中的start()。

新增方式一:实现Callable接口。 --- JDK 5.0新增

//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方法的返回值//get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。Object sum = futureTask.get();System.out.println("总和为:" + sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}

说明:

* 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?
* 1. call()可以返回值的。
* 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息
* 3. Callable是支持泛型的

新增方式二:使用线程池

class NumberThread implements Runnable{@Overridepublic void run() {for(int i = 0;i <= 100;i++){if(i % 2 == 0){System.out.println(Thread.currentThread().getName() + ": " + i);}}}
}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);}}}
}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 NumberThread());//适合适用于Runnableservice.execute(new NumberThread1());//适合适用于Runnable//        service.submit(Callable callable);//适合使用于Callable//3.关闭连接池service.shutdown();}}

说明:

* 好处:
* 1.提高响应速度(减少了创建新线程的时间)
* 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
* 3.便于线程管理
*      corePoolSize:核心池的大小
*      maximumPoolSize:最大线程数
*      keepAliveTime:线程没任务时最多保持多长时间后会终止

创建多线程的几种方式相关推荐

  1. java多线程w3c_Java创建多线程的三种方式

    前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...

  2. java创建多线程的四种方式

    java多线程的创建方式是面试经常会被问到的一个问题,因此在这里我对java创建多线程的四种方式做一个简单的归纳与总结,便于复习. 一.继承Thread类创建多线程 ① 创建一个继承于Thread类的 ...

  3. 创建多线程的四种方式

    创建多线程的四种方式 方式一:继承于Thread类 创建一个继承于Thread类的子类 重写Thread类的run()->将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通 ...

  4. 多线程一,什么是多线程,创建多线程的几种方式

    文章目录 1 多线程相关概念 2 多线程概念 3 多线程优缺点 4 多线程实现方式 5 实现runnable和callable的区别 6 继承thread和实现runnable接口的区别 7 多线程匿 ...

  5. 创建多线程的4种方式

    1.线程是什么? 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位.每个程序程序都至少有一个线程,也即是程序本身. 2.线程状态 Java语言定义了5种线 ...

  6. 【Java多线程】创建多线程的三种方式

    1.我的第一个多线程程序 方法一: extends Thread package cn.hanquan.test;public class StartThread extends Thread {@O ...

  7. 创建现成的四种方式 多线程与并发的基本概念:

    多线程与并发的基本概念: 多线程 一:什么是线程? 进程:进行中应用程序 线程:是进程组成者,一个进程中可能包含多个线程 cpu执行程序的最小单位是线程,cpu在同一时间内只能执行一个线程,在多个线程 ...

  8. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  9. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

最新文章

  1. linux vscode vim,VSCode Vim进阶操作
  2. ReentrantReadWriteLock读写锁
  3. CelebA数据库转换为VOC、YOLO格式
  4. VS2015一新建项目就出现未将对象引用设置到对象的实例怎么办?
  5. 文件的复制、移动、压缩等对SELinux属性关系详解
  6. subsonic 3.0 mysql_SubSonic 3.0新特性
  7. python列表转化为元组、集合_如何在Python中将元组列表更改为集合?
  8. 华为 P40 或首发鸿蒙系统;新 iPhone Logo 移至中间;React 组件库 uiw 3.4.0 发布 | 极客头条​...
  9. 阿里云 磁盘写保护 处理
  10. 基于Java计算器 科学计算器与标准计算器相互转化
  11. 手机游戏制作(开发流程)
  12. Opensuse 初学者使用指北?
  13. 作业指导书分析怎么做?制作作业指导书分析的软件有哪些?
  14. Julia 安装,使用教程
  15. dw怎么在框架中加入网页_如何在Dreamweaver中创建框架结构? dw设置框架结构的教程...
  16. compact mysql_mysql中compact行的存储结构
  17. 微信新出“一键拒收”功能!公众号主怎么办?
  18. Centos7下磁盘空间的扩容(超详细)
  19. 机器学习 - 计算 Log-Sum-Exp
  20. 助德清打造新AI 应用县,京东AI系列创新产品亮相地信会!

热门文章

  1. 【云原生】基于Kubernetes开发的阿里云ACK之可观测监控
  2. 2021年茶艺师(中级)试题及解析及茶艺师(中级)模拟考试题库
  3. python opencv 简单图像识别,标注 [升级版]
  4. CSS-一些高级技巧 随学笔记
  5. python 一幅图画多个曲线
  6. 追梦五年--IT之路辛酸苦楚唯我知
  7. 说说我理解的“自我管理”
  8. 一个基于bootstrap的简单新闻页面
  9. 【Camunda 三】Camunda模型文件部署
  10. 珠海植物组培实验室建设布局概述