目录
一、进程与线程的区别
二、为什么要使用多线程?
三、常见创建线程的方式
3.1、继承Thread类
3.2、实现Runnable接口
3.3、匿名内部类
3.4、匿名内部类(Lambda创建)
四、启动线程方式以及优先级
多线程相信大家可能有一定的认知与了解,比方说百度云下小视频,或者迅雷下种子,一次性能开启多个任务,这就是一个典型的多线程。
比如电脑运行应用程序的例子,打开QQ,这就是一个进程,我们在任务管理器(按Ctrl+Alt+.)进入点击任务管理器。可以看到,如图,总而言之:进程是所有线程的集合,每一个线程是进程中的一条执行路径。
举个例子:这个时候有个小姐姐要去楼下拿快递,但是她有20个快递要拿,假设一次拿五个快递,她就需要拿四次,但是这时小何出现了,和小姐姐一起去拿快递,这时就只需要两次即可完成!如图:
从中我们得出了一个结论:小何是个直男,不会陪小姐姐一起休息照顾她。当然不是这样。多线程之间互不干涉,互不影
响,即便是线程A挂掉,线程B也会继续运行,这就是为什么需要使用多线程。那么常见的应用场景当然就是群发短信了,比如
公司要给十万用户发短信,不可能一个线程一次一次的发送,这样效率太慢了,这次就需要用到多线程去处理!来提高效率!
这是一道面试时常见的问题。我们一般会说有两种,其实是有三种,当然四种也行,严格意义上来说只有三种。那么为什
么小何说能有四种呢?请听小何一一道来!
当然继承类使用的比较少,原因相信大家都知道,类只能继承一个,接口可以实现多个。
class AThread extends Thread { public void run() { System.out.println("Hello Word? No!IS Hello Thread!!!"); } } public class A { public static void main(String[] args) { new AThread().start(); } }打印结果为:
实现接口是常用的,对比继承Thread,优势多在还能继承一个类。
当然实现接口是没有start方法的,只能直接调用run方法,那么就不是一个新的线程了,所以我们在这里new出一个线程把
BThread放入然后再调用线程的start方法。
注意:启动一个线程 是调用start方法 不是run方法。 调用run方法相当于主线程执行。
class BThread implements Runnable { public void run() { System.out.println("Hello Word? No!IS Hello BThread!!!"); } } public class B { public static void main(String[] args) { Thread thread = new Thread(new BThread()); thread.start(); } }打印结果为:
匿名内部类相信有经验的开发者应该知道,这个在一些项目模式中不会常用,依项目类型与需求而定。
//使用匿名内部类方式创建线程 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("HI"); } }); thread.start();当然也可以直接在创建后start,不建立Thread对象
第四种其实只是基于第三种的优化,使用了Lambda而已,注意该种方式只存在于JDK1.8或以上:
//JDK1.8之后 Lambda创建 new Thread(() -> { System.out.println("A"); }).start();Start方法代表启动一个线程,run方法相当于调用,而不是启动线程。 main方法与线程方法同时运行,main会优先运行,因为是主线程。