文档章节

Java 创建线程的方式

j4love
 j4love
发布于 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();

© 著作权归作者所有

共有 人打赏支持
j4love
粉丝 49
博文 66
码字总数 62909
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部