12线程的状态 线程的五种状态: 1)新建(new) 用new语句创建的线程对处于新建状态,此时它和其它Java对象一样,仅仅在Heap中被分配了内存。当一个线程处于新建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。 Thread t = new Thread(new Runner()); 2)就绪(Runnable) 程序通过线程对象调用启动方法start()后,系统会为这个线程分配它运行时所需的除处理器之外的所有系统资源。这时,它处在随时可以运行的状态,在随后的任意时刻,只要它获得处理器即会进入运行状态。 t.start() 3)运行(Running) 处于这个状态的线程占用CPU,执行程序代码。在并发环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。如果计算机中有多个CPU,那么同一时刻可以让几个线程占用不同的CPU,使它们都处于运行状态,只有处于就绪状态的线程才有机会转到运行状态。 4)阻塞(Blocked) 阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。 阻塞状态可分为以下3种: 位于对象等待池中的阻塞状态(Blocked in object's wait pool):当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中。 位于对象锁池中的阻塞状态(Blocked in object's lock pool):当线程处于运行状态,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中。 其他阻塞状态(Otherwise Blocked):当前线程执行了sleep()方法,或者调用了其他线程的join()方法,或者发出了I/O请求时,就会进入这个状态。当一个线程执行System.out.println()或者System.in.read()方法时是,就会发出一个I/O请求,该线程放弃CPU,进入阻塞状态,直到I/O处理完毕,该线程才会恢复执行。 5)死亡(Dead) 当线程退出run()方法时,就进入死亡状态,该线程结束生命周期。线程有可能是正常执行完run()方法而退出,也有可能是遇到异常而退出。不管线程是正常结束还是异常结束,都不会对其他线程造成影响。
13. 数组和集合 1)数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。 2)数组要声明元素的类型,集合类的元素类型却是object。 数组转成集合注意事项: 1.不能使用集合的增删方法。因为数组长度不能改变,其它方法可以使用; 2.如果数组中的元素是引用数据类型,转成集合时,数组元素直接作为集合的元素;如果数组中的元素是基本数据类型,转成集合时,会将数组作为集合中的元素。
14、String、StringBuffer和StringBuilder 1)在执行速度方面的比较:StringBuilder > StringBuffer 2)StringBuffer与StringBuilder,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。 3)StringBuilder:线程非安全的,是线程不同步的(JDK1.5后出现) StringBuffer:线程安全的,是线程同步的 4.什么时候使用字符串缓冲区:数据多,个数无所谓确定,类型无所谓确定,只要最后都转变成字符串,就用字符串缓冲区。 对于三者使用的总结: 1)如果要操作少量的数据用 String 2)单线程操作字符串缓冲区 下操作大量数据 StringBuilder 3)多线程操作字符串缓冲区 下操作大量数据 StringBuffer(多线程中通常不建议使用StringBuffer,最好使用StringBuilder然后自己加同步)
|