Java多线程(四)java中的Sleep方法
点我跳过黑哥的卑鄙广告行为,进入正文。
Java多线程系列更新中~
正式篇:
- Java多线程(一) 什么是线程
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
- Java多线程(三)如何创建线程
- Java多线程(四)java中的Sleep方法
- Java多线程(五)线程的生命周期
番外篇(神TM番外篇):
- public static void sleep(long miliseconds)抛出InterruptedException
- public static void sleep(long miliseconds,int nanos)抛出InterruptedException
参数声明:
- miliseconds-以毫秒为单位的睡眠时间。
- nanos-这是0-999999额外纳秒的睡眠时间。
用法示例
1.不睡眠的情况
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { //try { // Thread.sleep(500); //}catch (InterruptedException e) { // e.printStackTrace(); //} System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
输出情况(每台计算机不一样,每次运行也会不一样,我截取部分数据分析)
t1: 1、2、3、4、5、6、7、8、9、10
t2: 1、2、3、4、5、6、7、8
t1: 11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30
……
可以看出,这两个线程的确是交替执行的。JAVA采用抢占式线程调度,也就是每个线程由系统来分配时间,线程的切换并不由线程本身决定。
2. 线程睡眠的情况
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { try { Thread.sleep(500); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
这个输出就是严格的一个一次的交替原则。
t1: 1
t2: 1
t1: 2
t2: 2
t1: 3
……
这是因为Sleep()使得当前线程进入阻塞状态,系统便调用了另一线程,循环往复,便出现了上面的输出结果。那么,什么情况阻塞,只有Sleep吗?这就引出了线程的生命周期。