线程
本来楼主是想把反射搞完的,但是因为楼主才疏学浅,自己还没搞明白,所以就先把楼主明白的贴上去,等以后楼主有了一定得知识储备再累忽悠大家,最近几天咱们说说最后一部分内容多线程的问题.
线程的概念
线程是代码的执行序列或者执行路径.线程与进程有些相似之处,它类似于一个轻量级的进程:一个操作系统中可以运行多个进程,一个进程内可以运行多个线程.每个应用程序至少运行在一个线程上.当只有一个线程时,称作单线程应用程序,该线程由系统自动创建.
平常咱们写的那些小程序都是单线程应用程序.这个线程就是由系统自动创建的.
每个线程都需要有一个入口点,对于咱们平常写的的应用程序来说,入口点为main()方法,执行Main()方法的线程通常被称为主线程(main Thread),主线程的入口点也是应用程序的起始点.对于单线程应用程序来说,代码是顺序执行的.
开发者完全可以手动创建线程,使用new Thread()方法创建一个线程,咱们创建的线程称作工作者线程.和主线程类似,工作者线程也需要一个类似Main()的入口方法.
只要引入了新线程,代码的执行路径就不是一条了,换句话说,应用程序就不是顺序执行了,由原来的”单车道”变为”双车道”,运行速率大幅度提升,但是真的是这样吗?
应用程序的操作大致可以分为两种类型,一种是占用CPU的(CPU-Bound),比如循环语句;一种是不占用或者极少占用CPU的(I/O-Bound),比如与各种外围设备的交互,包括硬盘,串口,键盘,TCP网络等.由于外围设备的运行速度很慢,CPU经常会处于等待状态,因此,将对外围设备的读取,写入,等待放到新建的线程中,以保证主线程可以立即执行后续的操作,这样是可以显著提供运行速率的.但是,如果将两组耗用CPU的操作分放到两个线程中”同时”执行,硬且应用程序运行在单核单CPU计算机上,那么并不会提高效率,因为CPU同时只能执行一个进程的一条线程,它会为每个线程分配一小段时间(称作时间片,通常是几十毫秒)来模拟他们的同步运行.CPU的线程切换也需要时间(两毫秒左右),执行保存,还原运行现场,挂起,继续线程等操作.当一个线程的时间片结束或者中断时,CPU会转去执行其他线程,此时称该线程被抢占了.
因为现在的多核CPU越来越普及,因此,编写多线程应用程序是有意义的.