一下记录下线程的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中线程的三种实现方式的更多相关文章

  1. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

  2. java中线程的几种实现方式

    1. 继承Thread类来实现 class MyThread extends Thread{ @Override public void run() { System.out.println(&quo ...

  3. Java中Singleton的三种实现方式解析

    一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当 ...

  4. Java实现线程的三种方式和区别

    Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...

  5. (转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...

  6. Java结束线程的三种方法(爱奇艺面试)

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  7. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  8. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  9. java中 this 的三种用法

    Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...

随机推荐

  1. 在java中如何处理日期格式问题

    1.最简洁的办法就是在对应的对象中加注解 如下一个例子: @DateTimeFormat(pattern="yyyy-MM-dd") @JsonFormat(pattern=&qu ...

  2. Redis学习-持久化机制

    Redis持久化的意义 在于故障恢复 比如你部署了一个redis,作为cache缓存,当然也可以保存一些较为重要的数据 如果没有持久化的话,redis遇到灾难性故障的时候(断电.宕机),就会丢失所有的 ...

  3. python基础_格式化输出(%用法和format用法)

      目录 %用法 format用法 %用法 1.整数的输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 1 >>> print('%o' % 2 ...

  4. python实现简单算法

    #选择n^2def selectSort(li): for i in range(len(li)-1): minLoc = i for j in range(i+1,len(li)): if li[j ...

  5. ColumnStore完整验证指南之安装与启动停止

    官方文档https://mariadb.com/kb/en/library/mariadb-columnstore/ 推荐使用最新1.2.x最新版本. 先决条件 yum -y install boos ...

  6. linux常用英文单词记录

    1.skip 跳过忽略 2.next 下一步3.hostname 主机名4.password 密码5.complete 完成6.network 网络7.conf config configuratio ...

  7. JDK源码分析(12)之 ConcurrentHashMap 详解

    本文将主要讲述 JDK1.8 版本 的 ConcurrentHashMap,其内部结构和很多的哈希优化算法,都是和 JDK1.8 版本的 HashMap是一样的,所以在阅读本文之前,一定要先了解 Ha ...

  8. Servlet和Filter的区别

    1.Filter是一个接口,而Servlet是一个类继承于Httpservlet 2.生命周期的不同,Filter在Web App被加载时,创建该Filter的实例,并调用init()方法(仅创建一个 ...

  9. ImportFileHandler 附件上传

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using LitJson; ...

  10. DRF认证组件流程分析

    视图函数中加上认证功能,流程见下图 import hashlib import time def get_random(name): md = hashlib.md5() md.update(byte ...