java中线程的三种实现方式
一下记录下线程的3中实现方式:Thread,Runnable,Callable
不需要返回值时,建议使用Runnable;有返回值时建议使用Callable
代码如下所示:
package com.four.day01; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* 此处主要是实现线程的三种方式
* 1.继承Thread类
* 2.实现runnable接口
* 3.实现Callable接口
* @author future
*
*/
public class TestThread { class MyThread extends Thread{
public void run(){
System.out.println("运行MyThread类中的run方法,使用继承创建线程");
}
} class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("运行MyRunnable类中的run方法,使用实现Runnable接口创建线程");
} } class MyCallable implements Callable<String>{ @Override
public String call() throws Exception {
System.out.println("运行MyCallable类中的call方法,使用实现Callable接口创建线程");
return "Class_Result";
} } public static void main(String[] args) throws Exception {
/**
* 线程的启动,是通过Thread类中的start()方法进行启动的
* 1.直接继承Thread时,直接实例化,调用实例中的start方法即可
* 2.实现Runnable接口的,需要把Runnable实例化对象放到Thread的构造方法中进行初始化
* 此线程运行后,没有返回结果,其运行的run方法是返回void类型的
* 3.实现Callable接口的,需要把Callable接口包装一下,最终可以放到Thread中进行运行线程
* 故通过FutureTask对Callable实例化对象进行包装,然后作为Thread的构造参数,
* 使用Thread类中的start方法进行启动
*
* 以上3者的区别
* Thread有单继承的局限性,若一个类继承线程Thread就不能继承其他类
* Runnable是接口,可以多实现,解决了单继承的问题,不过没有返回值
* Callable也是接口,不过线程运行完后会有返回值,是泛型的,可以自己指定
* 程序中的实例是String类型的
*
* 整体程序中,通过内部类进行实现的,在实例化内部类时,必须先实例化外部类(因为没有使用static修饰)
*/ TestThread testThread=new TestThread();
MyThread myThread=testThread.new MyThread();
myThread.start(); MyRunnable myRunnable=testThread.new MyRunnable();
Thread t=new Thread(myRunnable);
t.start(); MyCallable myCallable=testThread.new MyCallable();
FutureTask ftask=new FutureTask(myCallable);
Thread t2=new Thread(ftask);
t2.start();
System.out.println("Callable接口的返回值是:"+ftask.get());
} }
运行结果为:
运行MyThread类中的run方法,使用继承创建线程
运行MyRunnable类中的run方法,使用实现Runnable接口创建线程
运行MyCallable类中的call方法,使用实现Callable接口创建线程
Callable接口的返回值是:Class_Result
java中线程的三种实现方式的更多相关文章
- Java创建线程的三种主要方式
Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...
- java中线程的几种实现方式
1. 继承Thread类来实现 class MyThread extends Thread{ @Override public void run() { System.out.println(&quo ...
- Java中Singleton的三种实现方式解析
一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当 ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- (转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...
- Java结束线程的三种方法(爱奇艺面试)
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java中 this 的三种用法
Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...
随机推荐
- WEUI滚动加载
var row = 6, page = 1; var loading = false; //状态标记 $(document.body).infinite().on("infinite&quo ...
- opencv学习之路(39)、PCA
一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...
- 【我的前端自学之路】【HTML5】.html和.htm的区别
以下为自学笔记内容,仅供参考. 转发请保留原文链接:https://www.cnblogs.com/it-dennis/p/10508171.html .htm 和 .html 的区别 .htm 和 ...
- visual编译通过后,debug报错找不到*.dll
解决: 在debug目录下放入*.dll
- 微信支付之App支付
项目接入微信支付的准备工作: 注册成为开发者,进行资质认证,这里是需要300元的审核费用的: 在微信商户平台创建应用,提交等待审核(大致需要5-7个工作日): 应用审核通过之后,进入应用,开通微信支付 ...
- selenium+Headless Chrome实现不弹出浏览器自动化登录
目前由于phantomjs已经不维护了,而新版的Chrome(59+)推出了Headless模式,对爬虫来说尤其是定时任务的爬虫截屏之类的是一大好事. 不过按照网络上的一些方法来写的话,会报下面的错误 ...
- c#领域驱动设计
代码是个程序员都能写, 怎么的代码才是好的, --------------------------------------------------------------------------- ...
- ExtJs常用功能
1.判断内容是否修改 1) var cgrid = query_panel.cgrid; var v = cgrid.getValues(); //console.log(v); if (v != & ...
- element-UI——el-table添加序号
转载自:https://www.cnblogs.com/langxiyu/p/10641060.html Part.1 示例 当我们想在 el-table 中添加序号列时,如下: <el-tab ...
- vue单位文本控件与vue加密文本控件
vue单位文本控件: 使用方式: npm install dami-text-input --save 使用: <text-input v-model="test" :uni ...