创建线程的三种方式及其优缺点

Posted 永恒之光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建线程的三种方式及其优缺点相关的知识,希望对你有一定的参考价值。

package testA;

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

public class ThreadTest {
    public static void main(String[] args) {
        // 1.继承Thread类
        new DefineThread().start();
        // 2.实现Runnable接口
        new Thread(new DefineRunnable()).start();
        // 3.实现Callable接口
        new Thread(futureTask).start();
        String result = "";
        try {
            result = futureTask.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(result);
    }

    static class DefineThread extends Thread {

        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                String name2 = getName();
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name2 + ": " + i);
            }
        }
    }

    static class DefineRunnable implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                // String name2 = getName();
                String name = Thread.currentThread().getName(); // 实现runnable接口,使用Thread类的currentThread()获取当前线程对象
                try {
                    Thread.currentThread().sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name + ": " + i);
            }
        }
    }

    static FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {

        @Override
        public String call() throws InterruptedException {
            String name = "";
            int i = 0;
            for (; i < 100; i++) {
                name = Thread.currentThread().getName();
                Thread.currentThread().sleep(100);
                System.out.println(name + ": " + i);
            }
            return name + " ----->Result=" + i;
        }
    });
}

 

1.继承Thread类,限制了该类的扩展性。

2.实现Runnable接口,该类还可以实现其他接口,开启新线程时可以共享同一个target对象。

//new Thread(target).start();

3.实现Callable接口,线程执行体可以有返回值,并且可以抛出异常。

以上是关于创建线程的三种方式及其优缺点的主要内容,如果未能解决你的问题,请参考以下文章

并发编程(壹):创建线程的三种方式及其对比

java创建线程的三种方式及其对照

java创建线程的三种方式及其对比

java创建线程的三种方式及其对比

js的三种继承方式及其优缺点

创建线程有哪两种方法,它们各自的优缺点是啥?