java线程的3种创建方式及优缺点
线程创建简介
1.在java中表示线程的是Thread类。无论是那种方式创建线程,本质上都是创建Thread类的对象。

2.Thread类继承Runnable接口,且也有以Runnable作为参数的构造方法。

3.FutureTask这个类也实现了Runnable接口,故也可以作为参数传进Thread 里面来创建线程。
线程的创建
继承Thread类
package thread;
/**
* 继承thread类来创建线程
*
* @author dh
*
*/
public class ExtendsThread extends Thread {
public void run() {
for (int i = 0; i
实现Runnable接口
package thread;
/**
- 实现 Runnable接口
- @author dh
- */
public class ImplementRunnable implements Runnable {
private int i;
public ImplementRunnable(int i) {
this.i = i;
}
@Override
public void run() {
for (; i < 20; i++) { System.out.println(Thread.currentThread().getName() + " _" + i); }}
}
实现Callable接口
package thread; import java.util.concurrent.Callable; /**
- @author dh
- */
public class ImplementCallable implements Callable {
private int i;
public ImplementCallable(int i) {
this.i = i;
}
@Override
public String call() throws Exception {
for (; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " _" + i);
} return "1";}
}
创建线程
package thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
*
* @author dh
*
*/
public class TestD {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExtendsThread et = new ExtendsThread();
et.run();
ImplementRunnable imr = new ImplementRunnable(0);
Thread thread = new Thread(imr);
thread.start();
Thread thread1 = new Thread(imr);
thread1.start();
ImplementCallable implCallable = new ImplementCallable(1);
FutureTask ft = new FutureTask(implCallable);
Thread thread2 = new Thread(ft);
thread2.start();
System.out.println(ft.get());
}
}
}
结果如下:
main _0 main _1 main _2 main _3 main _4 main _5 main _6 main _7 main _8 main _9 Thread-1 _0 Thread-2 _0 Thread-1 _1 Thread-2 _2 Thread-1 _3 Thread-2 _4 Thread-1 _5 Thread-2 _6 Thread-1 _7 Thread-2 _8 Thread-1 _9 Thread-2 _10 Thread-1 _11 Thread-2 _12 Thread-1 _13 Thread-2 _14 Thread-1 _15 Thread-2 _16 Thread-1 _17 Thread-2 _18 Thread-1 _19 Thread-3 _1 Thread-3 _2 Thread-3 _3 Thread-3 _4 Thread-3 _5 Thread-3 _6 Thread-3 _7 Thread-3 _8 Thread-3 _9 Thread-3 _10 Thread-3 _11 Thread-3 _12 Thread-3 _13 Thread-3 _14 Thread-3 _15 Thread-3 _16 Thread-3 _17 Thread-3 _18 Thread-3 _19 1
3种方式创建的优缺点
1.继承Thread显然有个很大的缺点,java是单继承了,如果继承了Thread那么就无法继承其他类。但是继承Thread编写简单,实现方便。
2.实现Runnable接口和Callable接口。大致一样,区别就是Callable接口的实现可以有返回值,且可以抛出显示异常。其余大致一样。
他们的优势是实现接口,那么实现类可以有其他父类,避免的Thread的问题,其次可以用一个实现了该接口的对象来创建多个线程,从而方便一些基本的资源共享,因为是同一个对象。
java线程的3种创建方式及优缺点的更多相关文章
- java多线程总结一:线程的两种创建方式及比较
1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...
- java多线程总结一:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
- java多线程总结:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
- [转载]Java线程的两种实现方式
转载:http://baijiahao.baidu.com/s?id=1602265641578157555&wfr=spider&for=pc 前言 线程是程序的一条执行线索,执行路 ...
- Thread -线程的两种创建方式
package cn.learn.thread.Thread; /* 实现Runnable必须重写run()方法,一般推荐用Runnable实现 */ public class RunnableImp ...
- java线程的3种实现方式及线程池
1 准备数据 1.1 目标 为了形象地演示线程的工作现象, 准备两个文件datas/odds.txt和datas/evens.txt, 分别存储奇数和偶数, 内容如下: odds.txt 1 3 5 ...
- java线程的三种实现方式
线程实现的三种种方式: 一个是继承Thread类,实现run()方法: 一个是实现Runnable接口,实现run()方法: 一个是实现Callable接口,实现call()方法:该方式和实现Runn ...
- JAVA并发编程学习笔记------线程的三种创建方式
创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ pu ...
- java多线程的两种创建方式
方式一:继承Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()方法---> 将此线程执行的操作声明在run()中 3.创建Thread类的子类的对象 4. ...
随机推荐
- openstack如何整合vmare最佳方案
OpenStack中国社区编者按:通过多年的发展,VMWare在虚拟化市场处于领军地位,很多企业部署了VMWare虚拟化方案,随着OpenStack云计算平台的快速崛起,很多企业都面临一个问题:能否. ...
- *.hbm.xml作用是什么
实体与表的映射关系通过XML来描述的文件.在 hibernate.cfg.xml中管理,在项目启动的时候加载到内存. hbm指的是hibernate的映射文件 映射文件也称映射文档,用于向Hibern ...
- Struts2文件上传带进度条,虽然不是很完美
好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...
- java定时执行任务(一)
需求: 经常遇到这样的需求:要求每天执行一次任务,执行任务时间是凌晨3点 实现: 为了便于检测,我假设的是下一分钟执行任务,每10秒重复执行.(对应现实项目:每天3点执行任务.那么就是下一个3点执行任 ...
- MFC动态创建控件及其消息响应函数
这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...
- C#通过SC命令和静态公共类来操作Windows服务
调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...
- hibernate映射表
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibern ...
- html5 canvas 图像处理
1.图像放大缩小 <script> var cvs = document.getElementById("canvas"); cvs.width = cvs.heigh ...
- httpservlet在创建实例对象时候默认调用有参数的init方法 destroy()方法 service方法, 父类的init方法给子类实例一个config对象
- 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp
题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...