博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 创建线程的方式
阅读量:6451 次
发布时间:2019-06-23

本文共 2949 字,大约阅读时间需要 9 分钟。

  hot3.png

#继承 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
{ private static Long count = 10L; public static void main(String[] args) throws ExecutionException, InterruptedException { ImplCallableCreateThread call = new ImplCallableCreateThread(); FutureTask
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
futureTask = new FutureTask<>(call);new Thread(futureTask,"implements-callable-thread").start();

转载于:https://my.oschina.net/j4love/blog/914211

你可能感兴趣的文章
使用rman备份异机恢复数据库
查看>>
Win7-64bit系统下安装mysql的ODBC驱动
查看>>
node中非常重要的process对象,Child Process模块
查看>>
Webserver管理系列:3、Windows Update
查看>>
Linux内核源码详解——命令篇之iostat[zz]
查看>>
Sqlserver2000联系Oracle11G数据库进行实时数据的同步
查看>>
明年计划
查看>>
ORACLE功能GREATEST功能说明具体实例
查看>>
DataGridView 输入数据验证格式(实例)
查看>>
HDOJ 2151
查看>>
Foundation框架 - 快速创建跨平台的网站页面原型
查看>>
Intel 82599网卡异常挂死原因
查看>>
open-falcon
查看>>
三菱plc输出指示灯不亮怎么办(转载)
查看>>
doc2vec使用说明(一)gensim工具包TaggedLineDocument
查看>>
App测试中ios和Android的区别
查看>>
java.lang.NullPointerException&com.cb.action.LoginAction.execute(LoginAction.java:48)
查看>>
理解Docker :Docker 网络
查看>>
通过Application存取公共数据比如登录信息等..
查看>>
intellij maven配置与使用
查看>>