写点什么

Java 基础:线程的三种创建方式

  • 2024-07-05
    福建
  • 本文字数:1442 字

    阅读完需:约 5 分钟

一、继承 Thread 类


  1. 定义一个类继承线程类 Thread

  2. 重写 run()方法

  3. 创建线程对象

  4. 调用线程对象的 start()方法创建线程


Thread 类的常用 API


  • setName(String name):给线程取名字

  • getName():获取线程的名字

  • public static Thread currentThread():获取当前线程对象,这个代码在哪个线程中就获取哪个线程对象

  • public static void sleep(long time):让当前线程休眠多少毫秒再继续执行


优点:

  • 编码简单


缺点:

  • 线程类已经继承 Thread 就无法继承其他类了,功能无法通过继承拓展(单继承的局限性)


二、实现 Runable 接口


  1. 定义一个线程任务类实现 Runable 接口

  2. 重写 run()方法

  3. 创建线程任务对象

  4. 把线程任务对象包装成线程对象

  5. 调用线程对象的 start()方法启动线程

class MyRunable implements Runnable{
@Override public void run() { System.out.println("hello runable"); }}
复制代码


public static void main(String[] args) {    MyRunable target = new MyRunable();    Thread t = new Thread(target);    t.start();}
复制代码


优点:

  • 避免了 Java 单继承的局限性

  • 同一个任务对象可以被包装成多个线程对象

  • 适合多个线程去共享同一个资源

  • 实现解耦,线程任务代码可以被多个线程共享,线程任务代码和线程独立

  • 线程池只能放入实现 Runable 和 Callable 接口的线程任务,不能直接放入继承 Thread 类的线程对象


缺点

  • 编码复杂(其实还好啦)


匿名内部类的写法:

Runnable target = new Runnable() {    @Override    public void run() {        System.out.println("匿名内部类写法");    }};Thread t = new Thread(target);t.start();
//简化new Thread(new Runnable() { @Override public void run() { System.out.println("匿名内部类写法"); }}).start();
//再简化new Thread(() -> System.out.println("匿名内部类写法")).start();
复制代码


三、实现 Callable 接口


  1. 定义一个线程任务类实现 Callable 接口,申明线程执行的结果类型

  2. 重写线程任务类的 call 方法,这个方法可以直接返回执行结果

  3. 创建一个 Callable 的线程任务对象

  4. 把线程任务对象包装成一个未来任务对象

  5. 把未来任务对象包装成线程对象

  6. 调用 start()方法启动线程

//1.定义一个线程任务类实现Callable接口,申明线程执行的结果类型class MyCallable implements Callable<String>{
//2.重写线程任务类的call方法,这个方法可以直接返回执行结果 @Override public String call() throws Exception { System.out.println("hello callable"); return "success"; }}
复制代码


//3.创建一个Callable的线程任务对象Callable<String> call = new MyCallable();//4.把线程任务对象包装成一个未来任务对象//-- 未来任务对象其实就是一个Runable对象,这样就可以被包装成线程对象//-- 未来任务对象可以在线程执行完毕后得到线程执行结果FutureTask<String> future = new FutureTask<>(call);
//5.把未来任务对象包装成线程对象Thread t = new Thread(future);t.start();
//获取线程执行结果,如果线程还没执行完,让出CPU等线程执行完再来去结果try { String res = future.get(); System.out.println(res);} catch (InterruptedException e) { e.printStackTrace();} catch (ExecutionException e) { e.printStackTrace();}
复制代码


优点:

  • 拥有所有 Runable 的优点

  • 能直接得到线程执行的结果


缺点:

  • 编码复杂


文章转载自:救苦救难韩天尊

原文链接:https://www.cnblogs.com/GilbertDu/p/18284387

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Java基础:线程的三种创建方式_Java_不在线第一只蜗牛_InfoQ写作社区