线程创建与运行

152 阅读1分钟

线程的创建与运行

  Java中有三种线程创建方式,分别为实现Runnable接口的run方法,继承Thread类并重写run的方法,使用FutureTask方式。
1、继承Thread

public static class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("I am a child thread");
    }
}

2、实现Runnable接口

public static class RunnableTask implements Runnable {
    public void run() {
        System.out.println("I am a child thread");
    }
}

3、使用FutureTask方式

public static class CallerTask implements Callable<String> {
    public String call() throws Exception {
        return "hello";
    }
}

测试

public static void main(String[] args) throws InterruptedException {
    // 1、继承Thread
    MyThread myThread = new MyThread();
    myThread.start();

    // 2、实现Runnable接口
    RunnableTask task = new RunnableTask();
    new Thread(task).start();
    new Thread(task).start();

    // 3、实现Callable接口
    // 创建异步任务
    FutureTask<String> futureTask = new FutureTask<String>(new CallerTask());
    // 启动线程
    new Thread(futureTask).start();
    try {
        // 等待任务执行完毕,并返回结果
        String result = futureTask.get();
        System.out.println(result);
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

对比

方式优点缺点
继承Thread1、在run()方法内获取当前线程直接使用this就可以了,无须使用Thread.currentThread()方法
2、方便传参,可以在子类里面添加成员变量,通过set方法设置参数或者通过构造函数进行传递
1、java不支持多继承
2、任务与代码没有分离,当多个线程执行一样的任务时需要多份任务代码,Runable没有这个限制
3、没有返回值
实现Runnable接口1、任务与代码分离
2、可以继承其它类
1、没有返回值
2、传参只能使用主线程里面被声明为final的变量
使用FutureTask方式1、有返回结果1、传参只能使用主线程里面被声明为final的变量