文档章节

Java 创建线程的方式

j4love
 j4love
发布于 2017/06/04 18:33
字数 507
阅读 20
收藏 0
点赞 0
评论 0

#继承 java.lang.Thread

public class ExtThreadCreateThread extends Thread {

    public static void main(String[] args) {
        new ExtThreadCreateThread("extends-threadClass-thread").start();
    }

    public ExtThreadCreateThread() {}

    public ExtThreadCreateThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("class name [" + this.getClass().getName() + "] , " +
                "thread name [" + Thread.currentThread().getName() + "]");
    }
}

#实现 java.lang.Runnable

public class ImplRunnableCreateThread implements Runnable {

    public static void main(String[] args) {

        new Thread(new ImplRunnableCreateThread(),
                "implements-runnable-thread").start();
    }

    @Override
    public void run() {
        System.out.println("class name [" + this.getClass().getName() + "] , " +
                "thread name [" + Thread.currentThread().getName() + "]");
    }
}

#实现 java.util.concurrent.Callable

public class ImplCallableCreateThread implements Callable<Long> {

    private static Long count = 10L;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ImplCallableCreateThread call = new ImplCallableCreateThread();
        FutureTask<Long> futureTask = new FutureTask<>(call);
        new Thread(futureTask,"implements-callable-thread").start();

        Thread.sleep(200); // 避免 main 线程先执行完
        while (futureTask.isDone()) {
            System.err.println("mission completed return value " +
                    "[" + futureTask.get() + "]");
            break;
        }
    }

    @Override
    public Long call() throws Exception {
        while (count > 0) {
            count--;
            System.out.println("class name [" + this.getClass().getName() + "] , " +
                    "thread name [" + Thread.currentThread().getName() + "]" +
                    ", count [" + count + "]");
        }
        return count;
    }

}

#上述三种方式分析

  • extends java.lang.Thread

    ** 优点 :直接 new 当前对象调用 start 方法即可开启一个线程,对于初学者来说比较直观。 ** 缺点 : 采用继承这种强耦合性的方式;Java的单继承问题;需要提供和 java.lang.Thread 中对应的构造函数(比如:当创建一个线程的时候最好给线程起一个名字,这样排查问题,监控起来都会方便一些)。这时候就需要提供一个这样的构造函数:

public ExtThreadCreateThread(String name) {
        super(name);
    }
  • implements java.lang.Runnable (java.lang.Thread 实现了 Runnable 接口)

    ** 优点:采用实现接口的方式,类的扩展性更为灵活; ** 缺点 :无法自定义线程执行结束后的返回值类型,事实上 Runnable 接口的 run() 方法的返回值类型是 void。 在一些情况下我们需要得到某个线程正常结束后的一个结果,很显然 Runnable 不能帮助我们完成这件事情。(不过借住 Runnable 的子类 java.util.concurrent.FutureTask 可以完成这个功能)。

  • implements java.util.concurrent.Callable ** 优点 : 可以自定义返回结果;可以抛出经过检查的异常; ** 缺点 :在创建线程的时候需要再去实例化一个 java.util.concurrent.FutureTask 将Callable 交给 FutureTask , 再将 FutureTask (FutureTask 是 Runnable 的子类)交给 Thread。代码如下:

ImplCallableCreateThread call = new ImplCallableCreateThread();
FutureTask<Long> futureTask = new FutureTask<>(call);
new Thread(futureTask,"implements-callable-thread").start();

© 著作权归作者所有

共有 人打赏支持
j4love
粉丝 47
博文 60
码字总数 62909
作品 0
东城
程序员
14、Java并发性和多线程-Java ThreadLocal

以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有...

easonjim ⋅ 2017/06/16 ⋅ 0

InheritableThreadLocal详解

1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadL...

沈渊 ⋅ 04/12 ⋅ 0

Java并发编程之ThreadLocal源码分析

多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个...

狂小白 ⋅ 06/03 ⋅ 0

培训云计算学校,虚拟机基本结构讲解

我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机...

长沙千锋 ⋅ 05/17 ⋅ 0

云计算高级培训,Tomcat运维JVM 虚拟机常识

云计算高级培训,Tomcat运维JVM 虚拟机常识,作为了解JVM 虚拟机的开始。我们很有必要弄明白以下问题。 所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大...

长沙千锋 ⋅ 05/17 ⋅ 0

深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶 ⋅ 前天 ⋅ 0

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Java 编程之美:并发编程高级篇之一

本文来自作者 追梦 在 GitChat 上分享 「Java 编程之美:并发编程高级篇之一」 编辑 | 工藤 前言 借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。 ...

gitchat ⋅ 05/24 ⋅ 0

【JVM】 java内存区域与内存溢出异常

前言 此系列博客是读《深入理解java虚拟机》所做的笔记整理。 No1. JVM内存管理这堵墙? 对C和C++的开发人员来说,在内存管理领域,他们既拥有每一个对象的“所有权”,也担负着每一个对象生...

binggetong ⋅ 05/07 ⋅ 0

深入理解 ThreadLocal (这些细节不应忽略)

前言 对于 ThreadLocal 的使用,并不难。但要深入理解 ThreadLocal 的实现方式,需要细细揣摩。写本文前,我在网上看了很多关于 ThreadLocal 的分析,但却感到遗憾,因为很多文章存在着一定误...

徐志毅 ⋅ 04/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 23分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 39分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 今天 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部