java线程的实现方法_Java多线程的四种实现方式
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多线程的四种实现方式相关推荐
- java 线程同步的方法_Java多线程同步方法
Java多线程同步方法 package com.wkcto.intrinsiclock; /** * synchronized同步实例方法 * 把整个方法体作为同步代码块 * 默认的锁对象是this对 ...
- java 线程的基本概念_Java多线程——基本概念
线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...
- java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题
一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...
- java 线程的基本概念_Java多线程——多线程的基本概念和使用
一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在 ...
- python多线程实现方法_Python3 多线程的两种实现方式
最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...
- Java:简述Java多线程的四种实现方式
关联文章:<Java:简述Java中的多线程编程> Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来 ...
- 多线程的四种实现方式
1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和ExecutorService创建线程 4.通过线程池创建线程 前面两种可以归结为一类: ...
- java 线程死锁简单例子_java 多线程死锁详解及简单实例
java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...
- java线程中的死锁_Java多线程中的死锁 - Break易站
Java 多线程 synchronized关键字用于使类或方法线程安全,这意味着只有一个线程可以锁定同步方法并使用它,其他线程必须等到锁定释放并且其中任何一个获得该锁定. 如果我们的程序在多线程环境中 ...
最新文章
- 对Keil在线烧录程序弹出“The firmware of the connected J-Link[SN:xxxxxxxx] does not support......的问题解决
- MYSQL查询语句优化
- docker 制作本地镜像_Docker系列-(2) 镜像制作与发布
- 雅礼集训Day3-难题选讲
- EditPlus 3设置字体大小
- 【python快速入门】—唐宇迪课程笔记
- openpyxl 添加分页符
- 第八讲:1602液晶(郭天祥)
- pr cpu100%_PR插件Neat Video5.0.2安装教程
- mysql查询这一周数据库_MYSQL查询一周,一月内的数据
- 为什么老外不看好Filecoin?
- 关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(三)
- 如何在体育场创造极致观看体验
- Eclipse设置护眼背景调整字体
- 国产的开源电子表格web网页电子表格
- 使用awk处理多行fasta文件拆分为单个fasta文件,并去掉后缀^M
- 怎样安装win服务器系统,win服务器系统安装教程
- java计算机毕业设计ssm社区团购系统13kbd(附源码、数据库)
- Angular文件创建命令
- 配置完hadoop后调用HDFS的API进行统计英语单词数量