线程 --- 创建线程的七种方法

简介: 线程 --- 创建线程的七种方法

方法1 :继承Thread类,重写run方法,调用 start 方法启动


    public static void main(String[] args) {
        class MyThread extends Thread{
            @Override
            public void run() {
                System.out.println("成功创建线程!");
            }
        }
        MyThread thread = new MyThread();
        thread.start();
    }


方法2 :实现Runnable接口,重写run方法,调用 start 方法启动

public static void main(String[] args) {
        class MyRunnable implements Runnable {
            @Override
            public void run() {
                System.out.println("成功创建线程!");
            }
        }
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable,"继承Runnable接口实现");
        thread.start();
    }

方法3:匿名内部类 创建Thread 子类对象

    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("成功创建线程!");
            }
        };
        thread.start();
    }

方法4:匿名内部类 创建Runnable子类对象

public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("成功创建线程!");
            }
        });
        thread.start();
    }

方法5:使用 lambda 表达式 创建Runnable 子类对象

public static void main(String[] args) {
        Thread thread= new Thread(()->{
            System.out.println("成功创建线程!");
        });
        thread.start();
    }


方法6:使用线程池


创建线程池:

1. 使用 Executors.newFixThreadPool ( )  创建固定线程数的线程池

2.返回值的类型为 ExecutorService

3. 通过ExecutorsSercvice. submit 可注册一个任务到线程池中

例如:

public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        pool.submit(()->{
            System.out.println("一个在 线程池 中的线程 创建完成!");
        });
    }


Executors 创建线程线程池的一些方式(工厂方法):


1. newFixedThreadPool 创建固定线程数的线程池


2. newCachedThreadPool 创建线程数动态增长的线程池


3. newSingleThreadExecutor 创建只包含一个线程的线程池


4. newScheduledThreadPool 设定延迟时间后执行命令,或者定期执行(增强版的Timer)


方法7:使用Callable


什么是Callable?(带返回值的Runnable)


都是描述一个"任务" ,但是Callable 带有返回值,Runnable不带返回值。Callable 也是一个 interface。相当于把线程封装了一个“返回值”,方便程序员 借助多线程计算结果。


Callable 通常搭配 FutureTask 使用,FutureTask 的作用是用来保存Callable的返回值。FutureTask负责等待这个结果出来,但其实啥时候出来结果是不确定的(FutureTask就相当于我们点餐时候,收银员给的一个小票,Callable在后台做食物,我们拿着小票去领)


例子:创建线程计算1+2+3+4+ .......+1000

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.创建一个 callable 相当于 Runnable,但有了返回值 sum
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 1; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };
        //2. 创建一个FutureTask,task用来接收返回值
        //这里的返回值就相当于一个小票!即便这里的相加还没有开始
        FutureTask task = new FutureTask(callable);
        //3. 创建一个线程开始工作!进行相加!
        Thread t = new Thread(task);
        t.start();
        //4. 线程里的 Callable 任务完成!返回值被赋给 task
        //可以通过 task 里的 get() 方法获取到返回值!
        System.out.println(task.get());
    }


相关文章
|
22天前
|
监控 测试技术 程序员
解决线程死循环问题的有效方法
作为开发者想必都清楚,多线程应用程序的开发为我们日常开发工作中提供了并发执行任务的能力,但线程死循环问题却是一个常见而令人头疼的挑战,因为线程死循环可能导致系统的不稳定性、资源浪费以及应用程序的异常运行,所以准确地定位和妥善处理线程死循环现象,并在编码阶段就避免潜在风险,成为开发人员必须面对的重要问题,线程死循环问题的解决不仅有助于提高系统的稳定性和可用性,还能优化资源利用和提升应用程序的性能,通过采取适当的预防和处理措施,开发人员能够避免线程陷入无尽的循环,并及时发现和解决潜在问题。那么本文就来分享一下关于如何处理线程死循环问题,以及如何在编码阶段规避潜在风险。
30 2
解决线程死循环问题的有效方法
|
2月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
2月前
|
Java 测试技术
血的教训--如何正确使用线程池submit和execute方法
血的教训--如何正确使用线程池submit和execute方法
27 1
|
3月前
|
人工智能 Java API
Python 潮流周刊#28:两种线程池、四种优化程序的方法
Python 潮流周刊#28:两种线程池、四种优化程序的方法
24 1
|
4月前
|
监控 Java 应用服务中间件
剑指JUC原理-3.线程常用方法及状态(下)
剑指JUC原理-3.线程常用方法及状态
59 0
|
4月前
|
安全 Java Kotlin
面试必备:Kotlin 线程同步的 N 种方法
面试必备:Kotlin 线程同步的 N 种方法
84 0
|
5月前
|
Java
学习多线程之yield方法
学习多线程之yield方法
45 0
|
6月前
|
监控 安全 算法
Thread入门与线程方法详解及多线程安全
Thread入门与线程方法详解及多线程安全
22 0
|
12天前
|
NoSQL
线程死循环的定位方法
线程死循环的定位方法
17 2
|
14天前
使用代理IP池实现多线程的方法
使用代理IP池实现多线程的方法