首页 > 其他分享 >创建线程的4种方法

创建线程的4种方法

时间:2022-12-17 10:57:07浏览次数:37  
标签:Runnable log Thread 创建 void 线程 new 方法

线程创建方法

1、继承Thread,重写run方法

	    private static void one() {

            class T extends Thread{
                @Override
                public void run() {
                    log.debug("one is running...");
                }
            }

            T t = new T();
            t.start();
        }

简写

    private static void one() {

        Thread t = new Thread(){
            @Override
            public void run() {
                log.debug("one is running...");
            }
        };

        t.start();
    }

结果如图

2、Runnable配合Thread

Thread代表线程

Runnable代表可运行的任务(要执行的代码)

Runnable实现run方法,创建的对象作为Thread的构造参数

    private static void two() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                log.debug("two is running...");
            }
        };

        Thread t = new Thread(runnable);
        t.start();

//        //简写
//        Thread t = new Thread() {
//            @Override
//            public void run() {
//                log.debug("two is running...");
//            }
//        };
//        t.start();

//        //lambda表达式
//        Thread t = new Thread(() -> {
//            log.debug("two is running...");
//        });
//        t.start();
    }

3、FutureTask配合Thread

    private static void three() {
        //FutureTask间接继承了Runnable
        FutureTask<Integer> task = new FutureTask<Integer>(() -> {
            log.debug("three is running...");
            return 1;
        });

        Thread t3 = new Thread(task);
        t3.start();
    }

FutureTask可以接受Callable类型的参数,同时间接继承了Runnable,所以FutureTask可以作为Thread的构造参数创建线程

结果如图

4、使用ThreadPoolExecutor执行任务

    private static void four() {
        ThreadPoolExecutor t1 = new ThreadPoolExecutor(
                //核心线程数
                2,
                //最大线程数
                3,
                //救急线程存活时间
                1,
                //救急线程存活时间单位
                TimeUnit.SECONDS,
                //任务队列
                new ArrayBlockingQueue<Runnable>(5),
                //线程工厂,可以给线程起一个好名字
                r -> new Thread(r, "t1"),
                //拒绝策略
                new ThreadPoolExecutor.AbortPolicy()
        );

        t1.execute(() -> {
            log.debug("four is running...");
        });
    }

execute()接收Runnable类型的参数

结果如图

标签:Runnable,log,Thread,创建,void,线程,new,方法
From: https://www.cnblogs.com/WangJiQing/p/16988668.html

相关文章

  • linux(centos)创建虚拟环境并部署airflow
    一、创建虚拟环境1.安装virtualenv,virtualenvwrapperpipinstallvirtualenvvirtualenvwrapper安装好之后创建存放虚拟环境目录,这里我存在~/pythonvenv里,查看当前......
  • python多线程修改共享全局变量不安全
    当需要对全局变量进行更改时,则会出现不安全的情况 #-*-coding:utf-8-*-"""================================================================================......
  • 第二十章《Java Swing》第2节:窗体的创建
    JavaSwing的各种组件都是由类来定义的,这些类大部分都位于javax.swing包下,也有小部分位于java.awt包下,因此在使用这些类的时候需要在程序中引入这个包下的类。在JavaSwing......
  • 第十四章《多线程》第8节:线程池
    系统启动一个线程的成本是比较高的,因为启动线程的操作要与操作系统交互。如果程序中需要创建大量生存期较短的线程,那么使用线程池将会大幅度提高程序的运行效率。线程池中保......
  • 第十四章《多线程》第9节:ThreadLocal类
    如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有......
  • 第十四章《多线程》第7节:线程组
    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个......
  • 第十四章《多线程》第6节:线程通信
    之前所有的例子中,线程的执行都具有一定的随机性。如果希望线程能够有序的执行,必须使用线程通信技术。Java语言提供了一些线程通信的机制能够保证线程的有序执行,本小节将详细......
  • 第十四章《多线程》第4节:控制线程
    从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望......
  • 第一百一十四篇: JS数组Array(三)数组常用方法
    好家伙, 1.数组的复制和填充批量复制方法copyWithin(),以及填充数组方法fill()。这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引......
  • 【Java】单号创建服务
     需求:ERP项目存在若干个业务功能,每个业务的单子的单号创建规则需要被统一规划1、每个业务有自己对应的标识2、业务单号必须以英文字母为前缀,长度在2-4个字符3、单号......