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

本贴最后更新于 2065 天前,其中的信息可能已经渤澥桑田

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(); } } }

运行结果:
image.png

实现 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(); } } }

运行结果:
image.png

DEMO 总评

我们在很多场景下都会用到另开一个线程去处理任务,如不需要返回值的, 如耗时比较长的等等,那么就要熟练掌握创建线程的方法,希望大家能掌握常用的创建线程方法,让程序撑得起高并发! 少年,加油吧!!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...