为什么要有多线程?
单线程,就是指单个流水线的进程(A→B→C),这样的效率不太高。
多线程,指多个单线程同时进行,效率高。
生活场景:
-
购买电脑时,销售人员介绍这台电脑是cpu几核。通常来说,核越多,运行的就越快。单核CPU运行就是单线程,双核CPU就是多线程。
-
类似于生活中的行车道,有的车道小,只有一条道,所以容易造成拥挤。如果车道变宽,可以跑多个车道,那么效率就会高很多了。一条道为单线程,多条道为多线程,可以提高效率。
01 多线程的使用
-
继承Thread类,new Thread(){}.start(),重写run()方法,使用start()方法
-
实现Runnable接口,new Thread(new Runnable() {})。start()
两者的区别:
-
继承可以直接使用Thread类中的方法,代码简单。弊端:不能实现多继承
-
实现接口可以在子类继承父类的情况下使用。
02 并行与并发的区别
-
并行:多个程序共同进行,类似多个水管同时放水。
-
并发:多个程序依次发送,类似QQ聊天,先给A发消息,让A等着,再给B发消息,依此类推。
03 同步与异步的区别
-
同步:进行同一个步骤
A输入:”我”,”爱”,”编”,”程”
B输入:”我”,”不”,”爱”,”编”,”程”
如果A输入和B输入不是同步的,输出时可能会出现”我爱 我不爱编程 编程”。
如果A输入和B输入是同步的,输出则是”我爱编程 我不爱编程”
如果某一部分代码块(e.g. A输入/B输入)需要同步进行,则一定要设为同步synchronized/ (wait,notify).
-
异步:当调用一个需要花费很长时间来执行的方法,并不希望让程序等待方法返回时,就应该使用异步编程,在很多情况下,采用异步途径往往更有效率。
04 线程池
线程池就是类似于养鱼的池子,每一条鱼都是一个线程,当钓起一条鱼后,钓鱼这个动作就算完成了,而这条鱼当场不会死亡,又可以将这条鱼再放回线程池继续钓。