首页 > 编程语言 >Java中创建线程的多种方式实例

Java中创建线程的多种方式实例

时间:2024-03-26 17:29:24浏览次数:30  
标签:DateUtils Runnable Java Thread 创建 实例 线程 new

在Java中创建线程的方式有多种,以下是几种常见的创建线程的方式,选择哪种方式取决于具体的需求和设计。需要注意的是,在使用多线程时,要确保线程安全,避免出现并发问题。

1、普通Thread创建

//继承创建线程
    static class NewThread extends Thread {
        @Override
        public void run() {
            System.out.println("继承Thread创建线程-1 = " + DateUtils.getNowTime());
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("继承Thread创建线程-2 = " + DateUtils.getNowTime());

        }
    }

启动线程

        //普通Thread创建
        NewThread nt = new NewThread();
        nt.start();

2、实现Runnable接口创建线程

// 实现Runnable接口创建线程
    static class NewRunnable implements Runnable {
        @Override
        public void run() {

            System.out.println("实现Runnable接口-3 = " + DateUtils.getNowTime());

            //等待
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("实现Runnable接口-4 = " + DateUtils.getNowTime());
        }
    }

启动线程

        //普通Runnable创建
        NewRunnable nr = new NewRunnable();
        Thread t = new Thread(nr);
        t.start();

3、匿名方式创建

        //匿名Thread创建
        Thread t1 = new Thread(new Thread() {
            @Override
            public void run() {
                System.out.println("匿名Thread" + DateUtils.getNowTime());
            }
        });
        t1.start();


        //匿名Runnable创建
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名Runnable创建 = " + DateUtils.getNowTime());
            }
        });
        t2.start();

4、使用Lambda表达式创建线程


        //使用Lambda表达式创建线程
        Thread t3 = new Thread(() -> System.out.println("Lambda表达式创建1 = " + DateUtils.getNowTime()));
        t3.start();

        Runnable r = () -> {
            System.out.println("Lambda表达式创建2 = " + DateUtils.getNowTime());
        };
        Thread t4 = new Thread(r);
        t4.start();

5、实现Callable接口创建线程

在使用这个 Callable创建线程的时候,是有返回值的线程调用

    /**
     * 实现Callable接口创建线程
     * 是有返回值的线程调用
     */
    static class NewCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("实现Callable接口创建线程-5 = " + DateUtils.getNowTime());
            Thread.sleep(3000);
            System.out.println("实现Callable接口创建线程-6 = " + DateUtils.getNowTime());
            return "Callable接口创建线程";
        }
    }

启动线程

        //调用callable创建线程
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "callable创建线程";
            }
        };
        //FutureTask<String> futureTask = new FutureTask<>(callable);

        // 调用NewCallable()
        FutureTask<String> futureTask = new FutureTask<>(new NewCallable());
        Thread t5 = new Thread(futureTask);
        t5.start();

6、线程池方式

创建线程池的时候,可以定义线程池的大小,线程池中可以执行多个任务。若需要获取异步执行任务的返回值的话,使用submit方法;若是让一个任务在线程池中异步执行,使用execute方法即可。
//         相同点:
//         submit和execute方法均可以像线程池中提交一个任务,让线程池来异步执行这个任务
//         不同点:
//         submit可以接受Runnable和Callable任务,但execute只能接受Runnable任务;
//         submit方法的返回值是一个Future,而execute方法的返回值是void;
//         对于异常的处理,使用submit方式提交的任务若在执行的过程中抛出了异常的话,异常信息在控制台中看不到,需要通过Future.get方法来获取这个异常;
//         使用execute方式提交的任务若在执行的过程中出现异常的话,异常信息会被打印到控制台;

        // 创建一个10个大小的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        // 提交任务到线程池、创建一个线程
        executorService.submit(new NewRunnable());
        // 执行一个任务
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程池创建线程 = " + DateUtils.getNowTime());
            }
        });
        // 关闭线程池
        executorService.shutdown();

7、线程工具类


import com.terra.utils.DateUtils;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class T1 {

    public static void main(String[] args) {

        //普通Thread创建
        NewThread nt = new NewThread();
        nt.start();

        //匿名Thread创建
        Thread t1 = new Thread(new Thread() {
            @Override
            public void run() {
                System.out.println("匿名Thread" + DateUtils.getNowTime());
            }
        });
        t1.start();

        //普通Runnable创建
        NewRunnable nr = new NewRunnable();
        Thread t = new Thread(nr);
        t.start();

        //匿名Runnable创建
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名Runnable创建 = " + DateUtils.getNowTime());
            }
        });
        t2.start();

        //使用Lambda表达式创建线程
        Thread t3 = new Thread(() -> System.out.println("Lambda表达式创建1 = " + DateUtils.getNowTime()));
        t3.start();

        Runnable r = () -> {
            System.out.println("Lambda表达式创建2 = " + DateUtils.getNowTime());
        };
        Thread t4 = new Thread(r);
        t4.start();


        //调用callable创建线程
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "callable创建线程";
            }
        };
        //FutureTask<String> futureTask = new FutureTask<>(callable);

        // 调用NewCallable()
        FutureTask<String> futureTask = new FutureTask<>(new NewCallable());
        Thread t5 = new Thread(futureTask);
        t5.start();


//         相同点:
//         submit和execute方法均可以像线程池中提交一个任务,让线程池来异步执行这个任务
//         不同点:
//         submit可以接受Runnable和Callable任务,但execute只能接受Runnable任务;
//         submit方法的返回值是一个Future,而execute方法的返回值是void;
//         对于异常的处理,使用submit方式提交的任务若在执行的过程中抛出了异常的话,异常信息在控制台中看不到,需要通过Future.get方法来获取这个异常;
//         使用execute方式提交的任务若在执行的过程中出现异常的话,异常信息会被打印到控制台;

        // 创建一个10个大小的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        // 提交任务到线程池、创建一个线程
        executorService.submit(new NewRunnable());
        // 执行一个任务
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程池创建线程 = " + DateUtils.getNowTime());
            }
        });
        // 关闭线程池
        executorService.shutdown();


    }

    //继承创建线程
    static class NewThread extends Thread {
        @Override
        public void run() {
            System.out.println("继承Thread创建线程-1 = " + DateUtils.getNowTime());
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("继承Thread创建线程-2 = " + DateUtils.getNowTime());

        }
    }

    // 实现Runnable接口创建线程
    static class NewRunnable implements Runnable {
        @Override
        public void run() {

            System.out.println("实现Runnable接口-3 = " + DateUtils.getNowTime());

            //等待
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("实现Runnable接口-4 = " + DateUtils.getNowTime());
        }
    }

    /**
     * 实现Callable接口创建线程
     * 是有返回值的线程调用
     */
    static class NewCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("实现Callable接口创建线程-5 = " + DateUtils.getNowTime());
            Thread.sleep(3000);
            System.out.println("实现Callable接口创建线程-6 = " + DateUtils.getNowTime());
            return "Callable接口创建线程";
        }
    }

    // 使用线程池创建线程
    static class NewThreadPool {
        public static void main(String[] args) {
            // 创建大小2个任务的线程池
            ExecutorService executorService = Executors.newFixedThreadPool(2);
            // 提交任务
            executorService.submit(new NewRunnable());
            executorService.submit(new NewCallable());
            // 关闭线程池
            executorService.shutdown();
        }
    }


}

标签:DateUtils,Runnable,Java,Thread,创建,实例,线程,new
From: https://blog.csdn.net/qq_43544074/article/details/137051869

相关文章

  • java----------------------按位运算
    在日常开发中位运算不会很常用到,如果能够巧妙的使用位运算可以大量减少运行开销,优化算法。在java中一共有七种位运算符1.&:按位与两个操作数对应位同为1时,结果为1,其余全为0。(或者是只要有一个操作数为0,结果就为0)。将2个操作数和结果都转换为二进制进行比较:5转换为二进制:00000......
  • Java使用EasyExcel实现对excel文件的读写
    文章目录前言一、EasyExcel是什么?二、使用步骤1.引入库2.创建实体类3建立数据库4先建两个excel表5书写Mapper6书写测试类总结前言提示:这里可以添加本文要记录的大概内容:在学习Java中难免会有对文件的读写操作,像word文档、pdf文件以及excel表。这些读写操作都大......
  • java毕业设计小说阅读网(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的飞速发展,人们的阅读习惯也在逐渐改变。在线阅读逐渐成为人们获取文学作品的主要方式之一。小说阅读网站作为提供在线阅读服务的平台,因其......
  • java毕业设计小区物业管理系统(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加快,现代小区物业管理逐渐呈现出规模化、复杂化的特点。高效、规范的物业管理服务对于提升居民生活品质和社区环境至关重要。传统的物业......
  • Java代码
    publicclassDemo11{publicstaticvoidmain(String[]args){intarr1[]={0,1,2,3,4,5,6,7,8,9};intarr2[]=arr1;inta=0;for(inti=arr2.length-1;i>=0;i--){arr2[i]=a;a++;......
  • 37.html+css+js网页设计实例/“音乐”酒吧主题介绍/web前端期末大作业/
    一、前言本实例以“音乐”酒吧为主题设计,响应式web,应用html+css+js,包括图片轮翻效果、视频、音频、留言板等,供大家参考。【关注作者|获取更多源码(2000+个Web案例源码)|优质文章】;您的支持是我创作的动力!看到这里就【点赞收藏博文】,Web开发、课程设计、毕业设计有兴趣的联系我交......
  • 使用 IntelliJ IDEA 和 Maven 构建 Java 项目
    使用IntelliJIDEA和Maven构建Java项目在Java开发中,使用Maven是一种广泛采用的构建工具,而IntelliJIDEA则是一款功能强大的集成开发环境(IDE)。结合Maven和IntelliJIDEA,可以更加高效地管理和构建Java项目。本文将介绍如何在IntelliJIDEA中使用Maven构......
  • Java面试题:请解释Java中的集合框架?并详细说明各个集合的应用场景
    Java中的集合框架(CollectionFramework)是一组用来存储和管理对象的类和接口的集合,它为开发中常见的数据结构和算法提供了一种统一的、可重用的实现。Java集合框架的主要目的是提供一种灵活、可扩展的方式来存储和操作对象集合,而无需关心底层数据的存储细节。Java集合框架主......
  • Java中list.stream()各种常用方法汇总
    Java中list.stream各种常用方法汇总1.数据筛选-`filter()`filter()内值判断是否为true,横向筛选2.数据转换-`map()`map()内值是获取某个字段属性3.数据收集-`collect()`4.条件判断-`anyMatch()`,`allMatch()`,`noneMatch()`5.排序-`sorted()`6.遍历-......
  • java基础复习
    continue是结束本次循环继续下一次循环;break是结束整个循环;打印数组出来的是数组的地址值;动态初始化系统自动分配0;数组可以存引用数据类型,如对象;同一个方法名可以有不同的返回值,自动匹配形参;字符串比较字符串内容用booleanb=s1.equals(s2)、equalsIgnoreCase;遍历字符串......