• JAVA面试题——创建线程的三种方式


    在JAVA中创建线程一共有三种方式,分别是:

    (1)继承Thread类

    (2)实现Runnable接口

    (3)实现Callable接口

    接下来详细讲解每种方式的实现方法

    (1)继承Thread类

    实现步骤:

    1、创建一个类,继承Thread类

    2、重写类的run()方法

    3、实例化该类

    4、调用实例化对象的start()方法,启动线程

    1. package com.gsr.my_thread;
    2. public class ThreadTest extends Thread{
    3. @Override
    4. public void run() {
    5. for(int i=0;i<20;i++){
    6. System.out.println("这是线程的方法"+i);
    7. }
    8. }
    9. public static void main(String[] args) {
    10. //main线程
    11. //创建线程对象
    12. ThreadTest thread_test = new ThreadTest();
    13. //调用start方法
    14. thread_test.start();
    15. for(int i=0;i<20;i++){
    16. System.out.println("这是main线程的方法"+i);
    17. }
    18. }
    19. }

    (2)实现Runnable接口

    具体实现步骤如下:

    1、创建一个类,该类实现Runnable接口

    2、重写类的run()方法

    3、实例化该类,并将该实例作为参数,传入Thread中,调用其的start()方法。

    1. package com.gsr.my_thread;
    2. public class TestRunnable implements Runnable{
    3. @Override
    4. public void run() {
    5. for(int i=0;i<20;i++){
    6. System.out.println("这是线程的方法"+i);
    7. }
    8. }
    9. public static void main(String[] args) {
    10. //创建runnable接口的实现类对象
    11. TestRunnable testRunnable = new TestRunnable();
    12. //将改实现类,作为参数传入Thread
    13. new Thread(testRunnable).start();
    14. for(int i=0;i<20;i++){
    15. System.out.println("这是main线程的方法"+i);
    16. }
    17. }
    18. }

    (3)实现Callable接口

    接下来介绍该类方法的具体实现

    1、类需要实现Cabble接口

    2、重写Cabble接口的call()方法

    3、创建类的实例

    4、创建线程池,利用Executors.newFixedThreadPool()

    5、将两个实例作为参数,调用线程池的实例化对象的submit()方法,进行执行。

    6、使用结果的get()方法,获得返回值

    7、调用线程池实例化对象的shutdownNow方法,关闭线程池。

    1. package com.gsr.my_thread;
    2. import java.util.concurrent.*;
    3. public class TestCallable implements Callable {
    4. @Override
    5. public Boolean call() throws Exception {
    6. for(int i=0;i<20;i++){
    7. System.out.println("这是线程"+Thread.currentThread().getName()+"的方法"+i);
    8. }
    9. return Boolean.TRUE;
    10. }
    11. public static void main(String[] args) throws ExecutionException, InterruptedException {
    12. TestCallable testCallable = new TestCallable();
    13. TestCallable testCallable2 = new TestCallable();
    14. //创建线程池
    15. ExecutorService executorService = Executors.newFixedThreadPool(2);
    16. //提交给线程池进行执行
    17. Future result = executorService.submit(testCallable);
    18. Future result2 = executorService.submit(testCallable2);
    19. //得到返回的结果
    20. Boolean r1 = result.get();
    21. Boolean r2 = result2.get();
    22. //关闭线程池
    23. executorService.shutdownNow();
    24. }
    25. }

    特点:

    1、继承Thread类,会存在单继承的局限性

    2、实现Runnable接口,更加灵活,能够一个对象被多个线程使用

  • 相关阅读:
    AOP 笔记
    社区新零售:改变生活方式的创新商业模式
    【论文极速读】IMAGEBIND —— 通过图片作为桥梁桥联多模态语义
    nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS
    Linux 使用用户级别的 systemd 服务
    训练一个神经网络要多久,神经网络训练时间过长
    利用Gitlab进行代码的协作开发
    C++学习前言
    一个后端项目调用另一个后端项目的接口获取数据
    [剑指 Offer 27]二叉树的镜像
  • 原文地址:https://blog.csdn.net/qq_28790663/article/details/126387026