1.Java多线程实现的方式有四种:

1.继承Thread类,重写run方法

2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

3.通过Callable和FutureTask创建线程

4.通过线程池创建线程

2.Thread实现方式

继承Thread类,重写run()方法,创建Thread对象调用start()方法启动线程。

public class ThreadDemo extendsThread {

@Overridepublic voidrun() {int t = 1;for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+ " " + (t++));

}

}public static voidmain(String[] args) {

ThreadDemo td1= newThreadDemo();

ThreadDemo td2= newThreadDemo();

td1.setName("Thread1");

td2.setName("Thread2");

td1.start();

td2.start();

}

}

结果:

3.Runnable实现方式

实现Runnable接口,实现run()方法,接口的实现类的实例作为Thread的target传入带参的Thread构造函数,调用start()方法启动线程。

public class RunnableDemo implementsRunnable {

@Overridepublic voidrun() {int t = 1;for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+ " " + (t++));

}

}public static voidmain(String[] args) {

RunnableDemo rd= newRunnableDemo();

Thread tr1= newThread(rd);

Thread tr2= newThread(rd);

tr1.setName("Thread1");

tr2.setName("Thread2");

tr1.start();

tr2.start();

}

}

}

结果:

3.Callable和FutureTask创建线程实现方式

(1)创建Callable接口的实现类 ,并实现Call方法;

(2)创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值 ;

(3)使用FutureTask对象作为Thread对象的target创建并启动线程;

(4)调用FutureTask对象的get()来获取子线程执行结束的返回值。

importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTask;public class CallableFutureTaskDemo implements Callable{

@Overridepublic Integer call() throwsException {int t = 1;for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+ " " + (t++));

}returnt;

}public static voidmain(String[] args) {

Callable cftd1 = newCallableFutureTaskDemo();

Callable cftd2 = newCallableFutureTaskDemo();

FutureTask ft1 = new FutureTask<>(cftd1);

FutureTask ft2 = new FutureTask<>(cftd2);

Thread t1= newThread(ft1);

Thread t2= newThread(ft2);

t1.setName("Thread1");

t2.setName("Thread2");

t1.start();

t2.start();try{

System.out.println(ft1.get());

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(ExecutionException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

结果:

5.线程池实现方式

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public class ExecutorDemo implementsRunnable {private static int task_num = 2; //任务数量

@Overridepublic voidrun() {int t = 1;for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+ " " + (t++));

}

}public static voidmain(String[] args) {

ExecutorService executorService= Executors.newFixedThreadPool(3);for (int i = 0; i

ExecutorDemo ed= newExecutorDemo();

executorService.execute(ed);

}

executorService.shutdown();

}

}

结果:

java里面的线程池的顶级接口是Executor,Executor并不是一个线程池,而只是一个执行线程的工具,而真正的线程池是ExecutorService。

java中的有哪些线程池?

1.newCachedThreadPool创建一个可缓存线程池程

2.newFixedThreadPool 创建一个定长线程池

3.newScheduledThreadPool 创建一个定长线程池

4.newSingleThreadExecutor 创建一个单线程化的线程池

这里的例子用到的就是newFixedThreadPool 。

6.总结

(1)实现Runnable接口比继承Thread类更具有优势!Runnable接口适合多个相同的程序代码的线程去处理同一个资源,可以避免java中的单继承的限制,增加程序的健壮性,而且代码可以被多个线程共享,实现代码和数据独立。

(2)使用线程池可以减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务,可以根据系统的承受能力,调整线程池中工作线线程的数量。

(3)实际应用中,可以通过一个boolean标志位来结束线程。

(4)ExecutorService、Callable都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,还有Future接口也是属于这个框架,有了这种特征得到返回值更方便。

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的值(由泛型决定)了。get()方法是阻塞的,即线程无返回结果,get方法会一直等待。此外,ExecutoreService提供了submit()方法,传递一个Callable或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

java线程的实现方法_Java多线程的四种实现方式相关推荐

  1. java 线程同步的方法_Java多线程同步方法

    Java多线程同步方法 package com.wkcto.intrinsiclock; /** * synchronized同步实例方法 * 把整个方法体作为同步代码块 * 默认的锁对象是this对 ...

  2. java 线程的基本概念_Java多线程——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...

  3. java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题

    一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...

  4. java 线程的基本概念_Java多线程——多线程的基本概念和使用

    一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在 ...

  5. python多线程实现方法_Python3 多线程的两种实现方式

    最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...

  6. Java:简述Java多线程的四种实现方式

    关联文章:<Java:简述Java中的多线程编程> Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来 ...

  7. 多线程的四种实现方式

    1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和ExecutorService创建线程 4.通过线程池创建线程 前面两种可以归结为一类: ...

  8. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  9. java线程中的死锁_Java多线程中的死锁 - Break易站

    Java 多线程 synchronized关键字用于使类或方法线程安全,这意味着只有一个线程可以锁定同步方法并使用它,其他线程必须等到锁定释放并且其中任何一个获得该锁定. 如果我们的程序在多线程环境中 ...

最新文章

  1. pandas使用dropna函数删除dataframe中所有包含缺失值的数据行(drop rows which contain missing vlaues in dataframe)
  2. SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览
  3. Android开发-下载网络图片并显示到本地
  4. SpringMVC注解解析
  5. CNCC 技术论坛 | 知识图谱赋能数字经济
  6. 有り様、状態、様子 の 区別
  7. HDU1231 最大连续子序列【最大子段和】
  8. 华为鸿蒙系统ui界面会变吗,华为鸿蒙系统:全新UI界面
  9. Mysql5.7中文乱码
  10. 自定义JSON配置器
  11. 【E-DEEC】基于matlab增强的分布式能源有效集群(E-DEEC)【含Matlab源码 1566期】
  12. VMware Cloud Director Availability 4.0 百度网盘 下载
  13. 常用DNS列表(电信、网通)
  14. 2020计算机视觉会议地点,2020年计算机视觉与信息技术国际会议(CVIT 2020)
  15. 你都有哪些面试时被虐的经历?
  16. vasp计算压电系数_求助DFTP算出来的压电系数 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  17. 百度地图-初步的地图创建和标识
  18. BART中文摘要生成,(nplcc与LCSTS数据集)
  19. 一夜之间收到上百条短信,账户空了... 这种诈骗方式的背后技术原理
  20. word目录生成与页码处理

热门文章

  1. postgres数据库修改默认用户密码
  2. android webview 图片缓存,WebView 图片离线缓存(含图片)
  3. 18968-05-3,1,3,4,6-Tetra-O-acetyl-β-D-mannopyranose,1,3,4,6-四-氧-乙酰-β-D-吡啶甘露糖
  4. kfold和StratifiedKFold 用法
  5. maven制作脚手架
  6. 动漫漫画商城(Spring,SpringMVC,MyBatis,SSM,MYSQL,JSP,H-UI)
  7. ubuntu SMBus Host Controller not enabled
  8. video标签隐藏右下角的三个点-controls控件ui样式
  9. python的format函数的用法及实例
  10. 云服务器CentOS8.2安装部署Docker一文详解