首页 > 图灵资讯 > java面试题>正文

金三银四精选面试题-Java中有哪几种方式来创建线程执行任务?

2023-11-13 09:45:40

 

ava中有哪几种方式来创建线程执行任务?

 

1. 继承Thread类

/**
 * 作者:周瑜大都督
 */
public class ZhouyuThread extends Thread{


    public static void main(string[] args) {
        ZhouyuThread thread = new ZhouyuThread();
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("hello zhouyu");
    }


}

 

总结:重写的是run()方法,而不是start()方法,但是占用了继承的名额,Java中的类是单继承的。

 

讲到单继承,我们应该注意,ava中的接口是可以多继承的

 

2. 实现Runnable接口

/**
 * 作者:周瑜大都督
 */
public class ZhouyuThread implements Runnable{
    
    public static void main(String[] args) {
        Thread thread = new Thread(new ZhouyuThread());
        thread.start();
    }

    public void run() {
        System.out.println("hello zhouyu");
    }
    
}

 

总结:实现Runnable接口,实现run()方法,使用依然要用到Thread,这种方式更常用

 

有时候,我们会直接使用匿名内部类的方式或者Lambda表达式的方式:

/**
 * 作者:周瑜大都督
 */
public class ZhouyuThread {

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                System.out.println("hello zhouyu");
            }
        });
        thread.start();
    }
    
}

 

public class ZhouyuThread {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("hello zhouyu"));
        thread.start();
    }

}

 

3. 实现Callable接口

/**
 * 作者:周瑜大都督
 */
public class ZhouyuThread implements Callable<String> {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new ZhouyuThread());
        Thread thread = new Thread(futureTask);
        thread.start();
        String result = futureTask.get();
        System.out.println(result);
    }

    public String call() {
        return "hello zhouyu";
    }

}

 

总结:实现Callable接口,实现call()方法,得使用Thread+FutureTask配合,这种方式支持拿到异步执行任务的结果

 

4. 利用线程池来创建线程

 

/**
 * 作者:周瑜大都督
 */
public class ZhouyuThread implements Runnable {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        executorService.execute(new ZhouyuThread());
    }

    public void run() {
        System.out.println("hello zhouyu");
    }

}

 

总结:实现Callable接口或者Runnable接口都可以,由ExecutorService来创建线程

 

注意,工作中不建议使用Executors来创建线程池

总结

以上几种方式,底层都是基于Runnable。


 
上一篇 JVM高频面试题合集
下一篇 金三银四精选面试题-为什么不建议使用Executors来创建线程池?

文章素材均来源于网络,如有侵权,请联系管理员删除。