文档章节

Java 创建线程的方式

快乐肥宅
 快乐肥宅
发布于 2017/06/04 18:33
字数 507
阅读 21
收藏 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();

© 著作权归作者所有

共有 人打赏支持
快乐肥宅
粉丝 53
博文 70
码字总数 67278
作品 0
东城
程序员
14、Java并发性和多线程-Java ThreadLocal

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

easonjim
2017/06/16
0
0
InheritableThreadLocal详解

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

沈渊
04/12
0
0
深入研究java.lang.ThreadLocal类

一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局...

FoxHu
2012/05/08
0
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

没有更多内容

加载失败,请刷新页面

加载更多

Docker Compose 原理

Docker 的优势非常明显,尤其是对于开发者来说,它提供了一种全新的软件发布机制。也就是说使用 docker 镜像作为软件产品的载体,使用 docker 容器提供独立的软件运行上下文环境,使用 dock...

Java干货分享
20分钟前
0
0
解决过滤器中设置cookie无效的问题

解决过滤器中设置cookie无效的问题 代码现场 filterChain.doFilter(sessionSyncRequestWrapper, response);Cookie emailCook = WebServletUtil.getSelectedCookie(request.getCookies(), ......

黄威
31分钟前
0
0
Hbase Schema 设计注意事项及最佳实践总结

一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。这也是HBase被称为面向列族的存储(column-family-oriented store)的原因。 1、RowKe...

PeakFang-BOK
43分钟前
1
0
t-io给群组成员内置排序

1、实现比较器Comparator<ChannelContext> package xxx;import java.util.Comparator;import java.util.Objects;import java.util.Set;import java.util.TreeSet;import or......

talent-tan
47分钟前
2
0
px、em、rem 区别及作用

原文 起因: 一开始是为了解决页面放大时,字体不跟着放大的 bug。现在多用用于统一规范。 概念: 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em...

lemos
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部