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调用) 调用构造方法 ...
随机推荐
- 编译原理---antlr实践+编译过程理解+课程理解知识点
0.其他说明 0.0编译器分为前.中.后端,课上主要学的是前端.前端又分为词法分析(lexical analysis).语法分析(syntax analysis).语义分析(semantic anal ...
- jdk版本相关问题
1.switch在jdk1.7版本之后开始支持String类型: 2.maven3版本默认支持jdk版本为jdk1.5 3.编辑器中jdk版本设置为1.7或1.8版本,但未指定maven中的jdk版本 ...
- String<-->int
String s = "123); int a = Integer.parseInt(s); String b = String.valueOf(a); Integer i = 100; 自 ...
- MySQL删除foreign key_ERROR 1025 (HY000): Error on rename of './test_20180206/cc' to './test_20180206/#sql2-9ac-e' (errno: 152)
问题背景描述: 首先,创建了一个主表,具有以下数据结构: mysql> describe aa; +-------+----------+------+-----+---------+----- ...
- Gradle构建多模块项目
通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多 ...
- SonarQube安装文档
1.SonarQube 1.1 SonarQube介绍 SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误. SonarQube是否可以使用自定义规则由开发人员的开 ...
- 论文笔记:Siamese Cascaded Region Proposal Networks for Real-Time Visual Tracking
Siamese Cascaded Region Proposal Networks for Real-Time Visual Tracking 2019-03-20 16:45:23 Paper:ht ...
- Go 参数传递是传值还是传引用
什么是传值(值传递)? 传值的意思是:函数传递的总是原来这个东西的一个副本.一个副拷贝.比如我们传递一个 int 类型的参数,传递 的其实这个参数的一个副本:传递一个指针类型的参数,其实传递的是这个指 ...
- spring cloud 初体验
spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...
- “妄”眼欲穿之CSS 居中问题
妄:狂妄: 不会的东西只有怀着一颗狂妄的心,假装能把它看穿吧. 作为一个什么都不会的小白,为了学习,特别在拿来主义之后写一些对于某些css布局的总结,进一步加深对知识的记忆.知识是人类的共同财富,中华 ...