1:继承thread,记住启动线程是 .start();不是 .run() 切记
2:实现runnable :runnable是任务,启动还得把任务放到thread中才能启动,还有在runnable中无法使用thread方法,无法直接getname,需要用thread.方法 去操作,一定要切记

3:利用callable和future接口方式实现 看一下就好,应用的不多,要记住有这个方式,这个也是实现



前面几个没啥好说的,说下最后几个
1:守护线程

看图:把2设置成了守护线程,当线程1执行结束后,告诉线程2,你可以结束了,看下图,看仔细,线程2并没有把100条都执行完,当告知的那一刻,线程2陆陆续续的结束了,并不是立即停止,中间有个告知的时间

实际应用:当你聊天结束的时候,传输文件也可以停止,这就是守护线程

2:出让线程:
正常的当飞机抢到了cpu使用权之后,一顿输出,现在飞机抢到后,第二次输出的时候,再次与坦克公平竞争,每一次输出都公平竞争

3:插入线程
永远是thread线程先执行

线程的生命周期:

线程池原理:
核心线程满了就放到任务队列,队列满了就开启最大线程数,最大线程数也满了,就执行拒绝策略,如下图,如果有任务10,就被拒绝了



线程池怎么定义参数:
I/O密集型:比如大量线程等待在数据库的读写上,设高点,因为io的速度相对于cpu来说会很慢,根据公式计算

cpu密集型:完全没有阻塞,设置成cpu核心数就行,工程上一般设置核心数+1,这样的话当线程因为额外的内存也失效或者其他原因导致阻塞时,这个额外的线程可以顶上,从而保证cpu的利用率
762

被折叠的 条评论
为什么被折叠?



