首先什么是线程?一条线程指的是进程中一个单一顺序的控制流,说白了就是做某一件事的一段代码。进程我们可以简单地理解为一个运行中的程序,那么由于我们实际的需求,我们可能需要一个程序能同时做多件事情,比如我们使用软件听歌的时候,可能遇到好听的顺手就下载了,同时还会去看看评论什么的,那这就是多个线程协同的结果,所以一个进程至少包括一个线程。
使用多线程的优缺点:
优点:
1)适当的提高程序的执行效率(多个线程同时执行)。
2)适当的提高了资源利用率(CPU、内存等)。
缺点:
1)占用一定的内存空间。
2)线程越多CPU的调度开销越大。
3)程序的复杂度会上升。
一个CPU核心每次只能执行一个线程,所以就牵扯到了调度的问题,Java使用的是抢占式调度,谁抢到就是谁的,由于CPU的执行效率很高,所以我们是无法直接感觉到线程的不断切换的。可以类比马戏团的抛球游戏,因为速度很快,我们只能看到一个球。
然后要说的就是多线程的安全问题,因为进程是计算机资源分配的最小单位,所以多个线程共享一个内存资源,就会引起线程不安全问题。比如多个线程同时修改一个变量,可能一个线程拿到变量还未修改完毕的时候,另一个线程也拿到了修改前的变量值,那这一次操作就会导致两个线程修改同一个变量值。解决这类线程不安全的办法就是加锁,类似于排队上厕所,占到资源之后就锁上,用完就开开让别的线程使用。但是有时候因为锁的相互耦合会导致死锁,解决办法有:优化算法更合理的逻辑调度,设置超时时间,尽量减少多个功能使用同一把锁等。
什么时候使用多线程?
(1)耗时或大量占用处理器的任务阻塞用户界面操作;
(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。
然后是线程池,因为一个线程可能使用寿命很短,但是后边又要不停地创建新的线程执行新的功能,这样的不断创建和销毁会降低系统性能,因次出现了可以重复使用线程的线程池。
线程池的优点:
1)避免线程的创建和销毁带来的性能开销。
2)避免大量的线程间因互相抢占系统资源导致的阻塞现象。
3}能够对线程进行简单的管理并提供定时执行、间隔执行等功能。
java如何实现多线程:
创建线程有两种方式:
一、继承 Thread 类,扩展线程。
二、实现 Runnable 接口。
需要注意的是Thread 类中的 start() 和 run() 方法:
调用 start() 方法才会启动新线程;如果直接调用 Thread 的 run() 方法,它的行为就会和普通的方法一样;为了在新的线程中执行我们的代码,必须使用 Thread.start() 方法。