目录
CPU的执行
讲线程之前我们需要了解一个信息就是线程的运行是通过CPU来执行的
如下图打开任务管理器可以看到显示了CPU是几核的,有多少进程和线程
单核CPU一个时刻只能做一件事
四核CPU一个核一个时刻只能执行一个线程,所以CPU执行任务的时候是在快速切换任务,对应着分时操作系统
一般来说的话 linux一个任务,也就是一个线程执行在20ms左右,Windows几毫秒到几十毫秒不确定
多线程
现在我们可以开始讲多线程了
先看下面的这个程序,我们可以看出,虽然是t1线程先启动的,但是为什么执行出来的时候是t2线程先执行的呢?我们可以思考一下这个问题
线程start()
start()表示进去就绪态,不表示立刻执行,这个我们讲start方法最主要的一点
start()执行后会把线程的地址存在就绪队列中,同时start()方法会在栈中开辟一个新的空间,只要空间开辟出来,start()方法就结束了,新的线程启动成功,start()执行完毕后会在栈中创建一个新的线程栈,这里结合着下面的堆栈图理解
CPU执行一个线程时,如果另一个线程start了,这个线程就进入到了就绪态,等待上一个线程执行完,由于操作系统采用的时非公平的策略,CPU会从就绪队列随机选择一个线程执行(人为不可控),所以子线程的执行的顺序不确定,但由于子线程是依赖主线程启动的,所以一般主线程比子线程先启动,但主线程也不一定先执行完,这是为什么呢?
因为在分时操作系统中,线程在执行的过程中,时间片的时间到了,就会产生线程切换,就是在执行主线程的时候,有可能会切换到其中一个子线程执行,子线程执行的时候可能会切换到另一个子线程执行,从而导致主线程的执行完毕的顺序可能排在子线程后面
run方法
run方法就很简单了,run方法就是开始跑线程,
是实现线程的一个途径而已,我们实现线程的一种方法就是继承Thead类,然后我们就必须重写run方法