前言:
在java中每new一个线程,jvm都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。这样,当操作系统的可用内存越少,则jvm可用创建的新线程也就越少。
生命周期:
新建-就绪-(阻塞)-运行--死亡
1)其中当用new 创建完一个线程对象后,该线程处于新建状态。
2)当线程对象调用了start()后,该线程处于就绪状态。
3)如果处于就绪状态的线程获得CPU时间片,开始执行run方法的线程执行体,该线程处于运行状态。
4)如果线程调用了sleep()或者调用了一个阻塞式IO方法等,该线程处于阻塞状态。
5)如果线程的run()执行完成或者抛出一个未捕获的异常等原因,该线程处于死亡状态。
注意:
1、线程只有通过new Thread来创建,此时才会开辟线程所需要的堆空间。这个时候线程处于新建状态。新建状态指的是有一个Thread对象,但是并不是一个真正的线程。
2、实现Runnable的类必须通过new Thread(runnable)来创建一个线程。
3、当调用了线程的start()方法时才会为线程准备线程所需要的栈空间,此时线程从新建状态变成可运行状态(就绪状态)。调用start()方法之后如果该线程获得了执行的机会,其状态变成运行状态,其run()方法将被调用。
2、对Java的Thread或者Runnable来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。