侧边栏壁纸
博主头像
逆流者

不登高山,不知天之高也;不临深溪,不知地之厚也。

  • 累计撰写 147 篇文章
  • 累计创建 43 个标签
  • 累计收到 4 条评论
隐藏侧边栏

Java并发编程(二)创建线程

逆流者
2021-02-21 / 0 评论 / 0 点赞 / 160 阅读 / 1,881 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2021-02-21,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

创建线程的三种方式

  • 继承Thread类并重写run方法
  • 实现Runnable接口的run方法
  • 使用FutureTask方式

继承Thread类并重写run方法

public class ThreadTest {

    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
        }
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
Thread-0: 我是一个子线程

实现Runnable接口的run方法

public class RunnableTaskTest {

    public static class RunnableTask implements Runnable {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
        }
    }

    public static void main(String[] args) {
        RunnableTask task = new RunnableTask();
        new Thread(task).start();
        new Thread(task).start();
    }
}
Thread-0: 我是一个子线程
Thread-1: 我是一个子线程

使用FutureTask方式

public class CallableTaskTest {

    public static class CallableTask implements Callable<String> {

        @Override
        public String call() throws Exception {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
            return "hello";
        }
    }

    public static void main(String[] args) {
        // 创建异步任务
        FutureTask<String> futureTask = new FutureTask<>(new CallableTask());
        // 启动线程
        new Thread(futureTask).start();

        String result = null;
        try {
            result = futureTask.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(result);
    }
}
Thread-0: 我是一个子线程
hello

三种方式对比

  • 继承方式方便传参, 可以在子类中定义成员变量, 通过set方法或构造器进行初始化参数, 但是Java不支持多继承, 所以继承了Thread类的子类不能继承其他类了;
  • Runnable没有继承的限制
  • FuntrueTask方式可以拿到任务的返回结果, 前两种方式不行
0

评论