首页 > 试题广场 >

创建线程有哪几种方式

[问答题]

创建线程有哪几种方式

推荐

【得分点】

    Thread、Runnable、Callable

【参考答案】

标准回答

    创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。

1. 通过继承Thread类来创建线程的步骤如下:

o 定义Thread类的子类,并重写该类的run()方法,该方法将作为线程执行体。

o 创建Thread子类的实例,即创建了线程对象。

o 调用线程对象的start()方法来启动该线程。

2. 通过实现Runnable接口来创建线程的步骤如下:

o 定义Runnable接口的实现类,并实现该接口的run()方法,该方法将作为线程执行体。

o 创建Runnable实现类的实例,并将其作为参数来创建Thread对象,Thread对象为线程对象。

o 调用线程对象的start()方法来启动该线程。

3. 通过实现Callable接口来创建线程的步骤如下:

o 定义Callable接口的实现类,并实现call()方法,该方法将作为线程执行体。

o 创建Callable实现类的实例,并以该实例作为参数,创建FutureTask对象。

o 使用FutureTask对象作为参数,创建Thread对象,然后启动线程。

o 调用FutureTask对象的get()方法,获得子线程执行结束后的返回值。

加分回答

    采用接口的方式创建线程,优点是线程类还可以继承于其他类,并且多个线程可以共享一个线程体,适合多个线程处理同一份资源的情况。缺点是编程稍微麻烦一点点。

    采用继承的方式创建线程,优点是编程稍微简单一点点。缺点是因为线程类已经继承了Thread类,所以就不能继承其他的父类了。

    所以,通常情况下,更推荐采用接口的方式来创建线程。如果需要返回值,就使用Callable接口,否则使用Runnable接口即可。

【延伸阅读】

    下面给出一份使用三种方式创建线程的示例:

public class ThreadDemo1 {

 

    public static void main(String[] args) throws Exception {

        // 1

        new First().start();

        // 2

        new Thread(new Second()).start();

        // 3

        FutureTask<String> task = new FutureTask<>(new Third());

        new Thread(task).start();

        // 阻塞方法

        System.out.println("返回值: " + task.get());

private static class First extends Thread {

        @Override

        public void run() {

            System.out.println("First: " + Thread.currentThread().getName());

        }

 

    }

 

    private static class Second implements Runnable {

        @Override

        public void run() {

            System.out.println("Second: " + Thread.currentThread().getName());

        }

 

    }

 

    private static class Third implements Callable<String> {

        @Override

        public String call() throws Exception {

            System.out.println("Third: " + Thread.currentThread().getName());

            return Thread.currentThread().getName();

        }

 

    }

 

}



程序运行结果如下:

First:    Thread-0

Second:    Thread-1

Third:    Thread-2

返回值:  Thread-2


编辑于 2021-09-17 11:28:21 回复(0)
4种 
1.集成Thread
2.实现Runnable接口
3.实现callable接口
4.使用线程池
实现callable接口的方式可以有返回值,但是要借助futureTask来进行结果的获取返回
使用多线程的方式的好处就是避免了现成的时常创建和销毁,对线程进行重复利用,放进线程池的线程,可以直接获取,提高程序的性能。(实际上也是使用的前面3种方法,但是只是把他们进行了集中管理)
    1.提高响应的速度
    2.降低了资源的消耗
    3.便于对线程的管理
发表于 2022-04-28 15:48:33 回复(0)
三种。
1、使用Thread类,java提供了Thread类来表示线程,可以通过实例化Thread类对象来创建线程。创建Thread对象后,可以调用start()方法来启动线程。
2、 实现Runnable接口,Java中线程是通过Runnable接口来创建的。Runnable接口定义了一个run()方法,表示线程要执行的逻辑。start()来启动线程
3、使用Callable和Future,Callable的call()可以返回结果,并且可以抛出异常。可以使用Callable接口配合Future对象来创建线程。Future对象可以用来获取线程的执行结果或取消线程的执行
发表于 2023-05-24 18:51:51 回复(0)
1.继承Thread类并重写run方法创建线程,实现简单但是不可用继承其他类
2.实现runnable接口并重写run方法,避免了单继承局限性,编程更加灵活,实现解耦。
3.实现callable接口并重写call方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异常。
4.使用线程创建(使用java.util.current.Executor)
发表于 2022-07-21 17:38:50 回复(0)
总的来说,就是使用Runnable。Thread是子接口,Callable的实现也是要用Runnable。当然还可以通过线程池创建。
发表于 2022-04-19 19:22:45 回复(0)
继承Thread类创建线程:

- 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法成为执行体
- 创建Thread子类的实例也就是创建了线程对象
- 调用线程对象的start()方法来启动线程

通过Runnable接口创建线程类:

- 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体
- 创建Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象
- 调用线程对象的start()方法来启动该线程

通过Callable和Future创建对象:

- 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程的执行体,并且有返回值
- 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutrueTask对象封装了该Callable对象的call()方法的返回值
- 使用FutureTask对象作为Thread对象的target创建并启动新线程
- 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
发表于 2022-03-23 09:29:19 回复(0)
1,继承Thread
2,实现Runnable
3,实现Callable
发表于 2022-02-19 09:33:17 回复(1)