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. 对Keil在线烧录程序弹出“The firmware of the connected J-Link[SN:xxxxxxxx] does not support......的问题解决
  2. MYSQL查询语句优化
  3. docker 制作本地镜像_Docker系列-(2) 镜像制作与发布
  4. 雅礼集训Day3-难题选讲
  5. EditPlus 3设置字体大小
  6. 【python快速入门】—唐宇迪课程笔记
  7. openpyxl 添加分页符
  8. 第八讲:1602液晶(郭天祥)
  9. pr cpu100%_PR插件Neat Video5.0.2安装教程
  10. mysql查询这一周数据库_MYSQL查询一周,一月内的数据
  11. 为什么老外不看好Filecoin?
  12. 关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(三)
  13. 如何在体育场创造极致观看体验
  14. Eclipse设置护眼背景调整字体
  15. 国产的开源电子表格web网页电子表格
  16. 使用awk处理多行fasta文件拆分为单个fasta文件,并去掉后缀^M
  17. 怎样安装win服务器系统,win服务器系统安装教程
  18. java计算机毕业设计ssm社区团购系统13kbd(附源码、数据库)
  19. Angular文件创建命令
  20. 配置完hadoop后调用HDFS的API进行统计英语单词数量

热门文章

  1. quartus ii matlab,基於Quartus II和MATLAB的FIR濾波器設計與仿真(二)
  2. 儿童用白炽灯和护眼灯哪个好一点?2023最值得入手的儿童台灯推荐
  3. 电脑中复制提示剪切板被占用(重启资源管理器无用)
  4. java生成6位唯一id
  5. 如何成为一名黑客?小白必学的12个基本步骤
  6. Vue3+XLSX+FileSaver导出导入功能
  7. asp计算机等级考试系统源码,ASP在线考试系统 - WEB源码|源代码 - 源码中国
  8. 【高并发内存池】第一篇:定长内存池设计
  9. 《明日方舟》游戏拆解
  10. 诺亚方舟拯救了全人类