专栏首页java技术大本营java多线程|创建线程的各种方式

java多线程|创建线程的各种方式

javaDEMO

本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~ https://www.javastudy.cloud

创建线程

继承Thread类

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/01
 **/
public class ThreadStudy extends Thread{

    /**
     * 继承Thread类并且重写run方法,
     * 这个方法并不常用,因为一个java类只能继承一个类
     */
    @Override
    public void run() {
        System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());

        ThreadStudy study = new ThreadStudy();
        //注意启动线程要用 start()方法
        study.start();
        try {
            //让主线程休眠两秒,让子线程有足够的时间运行
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

运行结果:

实现Runnable接口

这种让一个类直接实现Runnable接口显得有些笨重 实际开发中,经常会用下面匿名类的方式创建线程

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/01
 **/
public class ThreadStudy implements Runnable{

    /**
     * 实现Runnable接口,
     * 这个是常用的方法,因为一个java类可以实现多个接口
     */
    @Override
    public void run() {
        System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());

        //要先new 一个Thread
        // 然后把实现Runnable接口的类传入到Thread的构造函数中
        ThreadStudy study = new ThreadStudy();
        Thread thread = new Thread(study);

        //注意启动线程要用 start()方法
        thread.start();
        try {
            //让主线程休眠两秒,让子线程有足够的时间运行
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

使用匿名类来创建线程,这里使用了lambda的写法,也是实际开发中常用的写法

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/01
 **/
public class ThreadStudy {


    public static void main(String[] args) {
        System.out.println("run in main Thread , Thread name is "+ Thread.currentThread().getName());

        // 不用类实现Runnable接口了, 直接这样定义,方便,省事
        Runnable runnable = ()-> System.out.println("run in sub Thread, Thread name is "+Thread.currentThread().getName());
        // 启动这个线程还是要用Thread来包装下,然后调用Thread.start()方法
        Thread thread = new Thread(runnable);
        thread.start();
        try {
            //让主线程休眠两秒,让子线程有足够的时间运行
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

使用线程池

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/01
 **/
public class ThreadStudy {


    public static void main(String[] args) {
        System.out.println("Run in main Thread, Thread name is "+ Thread.currentThread().getName());

        //一句话就可以创建一个线程池下面这种写法线程没有上限,实际开发中不太推荐
        // 开发中一般是用下行注释的方法,或者自定义线程池参数
        // 常用的还有 Executors.newFixedThreadPool(10);去创建固定10个线程的池子,这个也有弊端,就是等待的队列没有上界
        //
        ExecutorService service = Executors.newCachedThreadPool();
        // 没有返回值的处理
        service.submit(()-> System.out.println("Run in sub Thread, Thread name is "+Thread.currentThread().getName()));
        // 有返回值的处理,用一个Future 去接收
        Future<String> submit = service.submit(() -> "Run in sub Thread with return , Thread name is " + Thread.currentThread().getName());

        //输出future里面的值
        try {
            System.out.println(submit.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

运行结果:

本文分享自微信公众号 - java技术大本营(java-ideashare),作者:微笑的小小刀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 算法学习|双指针

    微笑的小小刀
  • java练习本(2019-08-12)

    “ Love is the triumph of imagination over intelligence. ”

    微笑的小小刀
  • java练习本(2019-08-18)

    “Never be jealous again. Never doubt that I love you more than the world. More t...

    微笑的小小刀
  • [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程

    Runnable是一个接口,定义一个类MyRunnable实现Runnable接口,实现run()方法,

    陶士涵
  • Java多线程之并发协作生产者消费者设计模式

    Java团长
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域...

    芋道源码
  • CountDownLatch 源码分析

    CountDownLatch 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE...

    lwen
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域...

    乔戈里
  • 面试|再次讲解Threadlocal使用及其内存溢出

    浪尖整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题。希望读懂此文以后大家可以掌握(没耐心的可以直接阅读底部总结):

    Spark学习技巧
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。

    良月柒

扫码关注云+社区

领取腾讯云代金券