前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >004.多线程-线程的三种创建方式

004.多线程-线程的三种创建方式

作者头像
qubianzhong
发布2018-12-12 13:53:04
3890
发布2018-12-12 13:53:04
举报
文章被收录于专栏:行者常至

1. extend Thread

代码语言:javascript
复制
package cn.qbz.thread;

public class ExtendThreadTest {
    public static void main(String[] args) {
        ExtendThread thread = new ExtendThread();
        thread.start();
        for (int i = 0; i < 300; i++) {
            System.out.println("主线程:" + Thread.currentThread().getName() + "  " + i);
        }
    }
}

class ExtendThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.println("子线程:" + this.getName() + "  " + i);
        }
    }
}

2. implement Runnable

代码语言:javascript
复制
package cn.qbz.thread;

public class ImplementRunnableTest {
    public static void main(String[] args) {
        ImplementRunnable runnable = new ImplementRunnable();
        Thread thread = new Thread(runnable);
        thread.start();

        for (int i = 0; i < 300; i++) {
            System.out.println("主线程:" + Thread.currentThread().getName() + "  " + i);
        }
    }
}

class ImplementRunnable implements Runnable {

    public void run() {
        for (int i = 0; i < 300; i++) {
            System.out.println("子线程:" + Thread.currentThread().getName() + "  " + i);
        }
    }
}

3.implement Callable

代码语言:javascript
复制
package cn.qbz.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeoutException;

public class ImplementCallableTest {
    public static void main(String[] args) {
        ImplementCallable callable = new ImplementCallable(666);
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();

        for (int i = 0; i < 300; i++) {
            System.out.println("主线程:" + Thread.currentThread().getName() + "  " + i);
        }

        try {
            System.out.println("子线程返回值:" + futureTask.get());
        } catch (InterruptedException e) {
            System.out.println("eeeeeeeeeeeeee222....." + e.getMessage());
        } catch (ExecutionException e) {
            System.out.println("eeeeeeeeeeeeee....." + e.getMessage());
        }
        for (int j = 0; j < 10; j++) {
            System.out.println("jjjjjjjjjjj  " + j);
        }
    }
}

class ImplementCallable implements Callable<Integer> {
    private Integer result;

    public ImplementCallable(Integer result) {
        this.result = result;
    }

    public Integer call() throws Exception {
        for (int i = 0; i < 300; i++) {
            System.out.println("子线程:" + Thread.currentThread().getName() + "  " + i);
            if (i == 268) {
                throw new TimeoutException();
            }
        }
        return result;
    }
}
  1. Implement Callable,重写call方法,不但可以返回值,还可以抛出异常。
  2. 抛出的异常,在futureTask.get()中被捕获
  3. futureTask.get()在执行的过程中会阻塞,一直到所在线程执行结束
  4. futureTask还有相关方法来进行了解线程的执行情况

三种创建方式的比较:

当前主流的就是面向接口开发, 因为实现了接口后还可以根据业务需要再继承其他的类。 实现Runnable接库与实现Callable接口对比来看, Callable接口有几个优势,也就是上面所说的: 可返回值,可抛出异常,可了解线程执行情况。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年11月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. extend Thread
  • 2. implement Runnable
  • 3.implement Callable
  • 三种创建方式的比较:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档