线程的等待:
多个线程,调度顺序,在系统中,是无序的(抢占式执行)
package Thread;public class Demo8 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(() ->{for (int i = 0; i < 1000; i++) {System.out.println("t1");}});Thread t1=new Thread(() ->{for (int i = 0; i < 6; i++) {System.out.println("t2");}});for (int i = 0; i < 100; i++) {System.out.println("main");}t.start();}
}
上述代码中,main和t线程,之间的结束顺序是不确定的,如果希望让代码里面的t能够结束,main结束,就可以在main中使用线程等待
package Thread;public class Demo8 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(() ->{for (int i = 0; i < 10; i++) {System.out.println("t1");}});t.start();t.join();for (int i = 0; i < 10; i++) {System.out.println("main");}}
}
main线程中调用t.join就是让main等待t,也就是t先结束,main后结束
main中调用上述join方法,有两种可能:
1,如果t线程此时已经结束,此时join就会立即返回
2,如果t线程此时还没结束,此时join就会阻塞等待.一直等待到t线程结束之后,join才能解除阻塞,继续执行(这就确保了main线程一定是后结束的)
谁调用join谁就阻塞,比如代码中有main线程,又有t1,t2,此时main调用t1.join,main阻塞,t1和t2都正常执行,如果是t1里调用t2.join,就是t1阻塞,t2和main正常执行。(main线程不能被join)
package Thread;public class Demo8 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(() ->{for (int i = 0; i <5 ; i++) {System.out.println("t");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t1=new Thread(() ->{for (int i = 0; i < 5; i++) {System.out.println("t1");try {t.join();Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();t1.start();for (int i = 0; i < 10; i++) {System.out.println("main");}}
}
join还有一个要点
t.join();
这个join无参数版本死等,不见不散,只要t不结束,join就会一直等待下去
join(long millis(等待Nms))
这个有参数版本的传入的时间,就是等待的最大时间(比如写了等待10ms,如果10ms之内,t线程结束了,直接返回。如果10ms到了,t还没结束,不等了,继续往下走)
join(long millis,int nanos)(等待N毫秒,等待M纳秒)
System.currentTimeMillis(){获取到当前系统的ms级时间戳}
使用sleep控制的是"线程休眠的时间",而不是“两个代码执行的间隔时间”
package Thread;public class Demo9 {public static void main(String[] args) throws InterruptedException {System.out.println("beg "+System.currentTimeMillis());Thread.sleep(1000);System.out.println("end "+System.currentTimeMillis());}
}
对线程的状态,大概是分成了6个不同的状态
1,NEW Thread对象有了,还没调用start系统内部的线程还未创建
2,terminated 线程已经终止,内核中的线程已经销毁了,Thread对象还在
runnable 就绪状态
指的是,这个线程“随叫随到”
a)这个线程正在cpu上执行
b)这个线程虽然没在cpu上执行,随时可以调度到cpu上执行
4 waitng 死等 进入阻塞
5 timed_waiting 带有超时时间的等
6 blocked 进行锁竞争的时候产生的阻塞