• 线程的创建方式


    一、继承Thread类

    子类可以继承Thread类,重写Thread类的run()方法从而创建线程

    public class Thread1 extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"执行了~~~");
        }
    
        public static void main(String[] args) {
            Thread1 thread1=new Thread1();
            thread1.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这种方式直接创建子类的实例化对象,调用start()方法既可启动线程

    二、实现Runnable接口

    子类实现Runnable接口,重写run()方法,这里实际上还是重写的Thread类的run()方法

    /**
     * @author :xuezhiqian
     * @description:TODO:实现Runnable接口
     * @date :2022/8/1 9:47
     */
    public class Thread2 implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"执行了~~~~~");
        }
    
        public static void main(String[] args) {
            //需要创建一个Thread对象,将实现了Runnable接口类的对象传进去
            Thread thread=new Thread(new Thread2());
            thread.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    也可以使用匿名内部类创建线程

            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " 执行了~~~");
                }
            },"匿名内部类线程");
            thread.start();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    同时这种只有一个抽象方法的接口,可以使用Lambda表达式

            Thread thread2=new Thread(()->{
                System.out.println("Lambda表达式");
            });
            thread2.start();
    
    • 1
    • 2
    • 3
    • 4

    三、实现Callable接口

    实现Callable接口,重写它的call()方法
    注意:

    Callable接口是有返回值的,要获取他的返回值,需要结合FutureTask

    /**
     * @author :xuezhiqian
     * @description:TODO:实现Callable接口
     * 这是一个有返回值的
     * @date :2022/8/1 9:52
     */
    public class Thread3 implements Callable<Integer>{
        //重写call方法
        @Override
        public Integer call() throws Exception {
            Integer result=10;
            System.out.println(Thread.currentThread().getName()+"Callable接口执行了~~~ " );
            return result;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            //需要使用FutureTask包装实现了Callable接口类的实例化对象
            FutureTask<Integer> task=new FutureTask<>(new Thread3());
            Thread thread=new Thread(task);
            thread.start();
            //获取返回值需要调用FutureTask的get()方法
            Integer result=task.get();
            System.out.println(result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    四、创建定时器线程

    public class TimmerThread {
        public static void main(String[] args) {
            Timer timer=new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("定时器线程执行了~~~");
                }
            },3000,3000);
            //delay:延迟多久开始执行(例如这个代码就是延迟三秒开始执行第一次);
            //period:执行周期,就是隔多久执行一次
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    补充:
    直接调用run()方法和调用start()方法有什么区别?

    我们的目的是创建一个子线程去执行run()方法中的内容,主线程继续向下执行。
    而直接在主进程中调用run(),就相当于调用了一个普通方法,主程序会进入run()方法,执行完毕后退出run()方法继续执行主方法,就没有新线程的产生。而调用start()方法,会产生一个新的线程,主线程不会进入run()方法,run()方法的执行交由新线程去执行,主线程继续向下顺序执行。

  • 相关阅读:
    RK3568平台开发系列讲解(工具命令篇)MobaXterm 软件安装及使用
    DVWA-impossible代码审计
    高薪程序员&面试题精讲系列137之你熟悉Zookeeper吗?Zookeeper如何实现分布式锁?说说Zookeeper的原理吧
    DELL远程控制卡 使用ipmitools设置ipmi
    android 12出现 Targeting S+ (version 31 and above)问题
    ARMday02(汇编语法、汇编指令)
    SpringBoot SpringBoot 原理篇 2 自定义starter 2.6 拦截器开发
    联盟链 Hyperledger Fabric 应用场景
    Elasticsearch(二)kibana数据检索
    对于构建自定义协议的思考(Java)
  • 原文地址:https://blog.csdn.net/qq_45681368/article/details/126095515