Java 创建线程的方式
博客专区 > j4love 的博客 > 博客详情
Java 创建线程的方式
j4love 发表于4个月前
Java 创建线程的方式
  • 发表于 4个月前
  • 阅读 14
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 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();
标签: java 线程
共有 人打赏支持
粉丝 6
博文 27
码字总数 21521
×
j4love
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: