当前位置: 首页 > news >正文

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

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

1.继承Thread类

继承Thread类,重写run()方法,创建一个Thread对象并调用其start()方法启动线程。

public class Thread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("测试打印线程"+i);
        }
    }

    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        thread1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我是主线程"+i);
        }
    }
}

但是要注意一下run和start的区别:

在Java中,Thread.start()Thread.run() 方法也可以用来启动一个新线程。

在Java中,调用 Thread.start() 方法会创建一个新线程并使其执行该线程的 run() 方法中的代码。而 Thread.run() 方法只是在当前线程中直接调用 run() 方法的代码。这就意味着如果你调用 run() 方法,那么它实际上就是在当前线程中执行,而不是在新线程中运行。

因此,如果你想要创建一个新线程来并发地执行任务,你应该使用 Thread.start() 方法。它将会使得新线程在后台执行,以便让程序并行地执行多个任务。而如果你只是想在当前线程中执行一些简单的操作,你可以直接调用 Thread.run() 方法。

总结一下,Java中的Thread.start()Thread.run()方法的区别如下:

  • Thread.start() 方法会创建一个新的线程,并在该线程中执行 run() 方法中的代码。
  • Thread.run() 方法是在当前线程中直接调用 run() 方法的代码。

2.实现Runnable接口

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

3.实现Callable接口

public class Thread3 implements Callable<Boolean> {
    @Override
    public Boolean call() throws Exception {
        System.out.println("实现了callable");
        return true;
    }

    public static void main(String[] args) {
        Thread3 thread = new Thread3();
        FutureTask<Boolean> futureTask = new FutureTask<Boolean>(thread);
        Thread t = new Thread(futureTask);
        t.start();
    }
}

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

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

public class Executor implements Runnable{

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        executorService.execute(new Executor());
    }
    
    @Override
    public void run() {
        System.out.println("使用线程池创建线程");
    }
}

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

public class Executor {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 5; i++) {
            executor.submit(() -> {
                System.out.println("Thread-" + Thread.currentThread().getId() + " start");
                // do some work...

                System.out.println("Thread-" + Thread.currentThread().getId() + " end");
            });
        }
        executor.shutdown();
        // 等待所有任务完成
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        System.out.println("All tasks done.");
    }
}
Thread-12 start
Thread-15 start
Thread-15 end
Thread-14 start
Thread-13 start
Thread-14 end
Thread-12 end
Thread-16 start
Thread-16 end
Thread-13 end
All tasks done.

5.总结

以上几种方式,底层都是基于Runnable。所以创建线程的方式有4种也可以说是1种。

相关文章:

  • 制作INCA和CANape通用的A2L
  • 【华为OD机试真题2023 JAVA】寻找核酸检测点
  • ChatGPT是如何训练得到的?通俗讲解
  • 蓝桥杯历年真题训练
  • 做技术,最忌讳东张西望
  • 大学生考研的意义?
  • 2023年最新最全 VSCode 插件推荐
  • 大屏页面使用transform属性scale进行缩放,高德地图点击事件失效,地图展示模糊
  • Docker圣经:大白话说Docker底层原理,6W字实现Docker自由
  • css实现炫酷充电动画
  • hadoop理论基础(一)
  • FPGA之时钟规划图解
  • python 绘图时出现报错:A colormap named “BlueWhiteOrangeRed“ is already registered.
  • 安卓手机也可以使用新必应NewBing
  • C++并发编程之三 并发操作的同步
  • ----------
  • @angular/forms 源码解析之双向绑定
  • Angular Elements 及其运作原理
  • Angular 响应式表单之下拉框
  • C语言笔记(第一章:C语言编程)
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java程序员幽默爆笑锦集
  • js数组之filter
  • leetcode46 Permutation 排列组合
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Odoo domain写法及运用
  • react-native 安卓真机环境搭建
  • scala基础语法(二)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webpack4 一点通
  • Web标准制定过程
  • Zsh 开发指南(第十四篇 文件读写)
  • 产品三维模型在线预览
  • 聊聊flink的TableFactory
  • 三栏布局总结
  • 微信公众号开发小记——5.python微信红包
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • #考研#计算机文化知识1(局域网及网络互联)
  • (007)XHTML文档之标题——h1~h6
  • (Forward) Music Player: From UI Proposal to Code
  • (Note)C++中的继承方式
  • (二)pulsar安装在独立的docker中,python测试
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (离散数学)逻辑连接词
  • (转载)(官方)UE4--图像编程----着色器开发
  • .gitignore文件---让git自动忽略指定文件
  • .net framework4与其client profile版本的区别
  • .NET 中让 Task 支持带超时的异步等待
  • @synthesize和@dynamic分别有什么作用?
  • [20171106]配置客户端连接注意.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [autojs]逍遥模拟器和vscode对接
  • [C++]AVL树怎么转
  • [CakePHP] 在Controller中使用Helper