文档章节

Java 创建线程的方式

OSC首席混子
 OSC首席混子
发布于 2017/06/04 18:33
字数 507
阅读 23
收藏 1

#继承 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();

© 著作权归作者所有

共有 人打赏支持
OSC首席混子
粉丝 56
博文 76
码字总数 72880
作品 0
东城
程序员
私信 提问
Java多线程下 ThreadLocal 的应用实例

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。...

空云万里晴
2014/01/06
0
0
Spring的事务管理难点剖析(4):多线程的困惑

由于Spring的事务管理器是通过线程相关的ThreadLocal来保存数据访问基础设施(也即Connection实例),再结合IoC和AOP实现高级声明式事务的功能,所以Spring的事务天然地和线程有着千丝万缕的...

icheer
2012/07/17
0
0
ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生
2015/11/21
0
0
java.lang.ThreadLocal类研究

java.lang.ThreadLocal类研究 1、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为...

SDK4
2011/09/17
0
2
14、Java并发性和多线程-Java ThreadLocal

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

easonjim
2017/06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
15
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部