方法
Join
调用方线程(调用join方法的线程)执行等待操作,
直到被调用的线程(join方法所属的线程)结束,再被唤醒
public final void join() throws InterruptedException {
join(0);
}
public class JoinDemo extends Thread{
int i;
Thread previousThread; //上一个线程
public JoinDemo(Thread previousThread,int i){
this.previousThread=previousThread;
this.i=i;
}
@Override
public void run() {
try {
//调用上一个线程的join方法,大家可以自己演示的时候可以把这行代码注释掉
// thread.join的含义是
// 当前线程需要等待previousThread线程终止之后才从thread.join返回。
// 简单来说,就是线程没有执行完之前,会一直阻塞在join方法处。
previousThread.join(); //
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("num:"+i);
}
public static void main(String[] args) {
Thread previousThread=Thread.currentThread();
for(int i=0;i<10;i++){
JoinDemo joinDemo=new JoinDemo(previousThread,i);
joinDemo.start();
previousThread=joinDemo;
}
}
}
yield
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。
Sleep
interrupt
interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号告诉它,它应该要结束了(明白这一点非常重要!)
- 也就是说:Java设计者实际上是想线程自己来终止,通过上面的信号,就可以判断处理什么业务了。
- 具体到底中断还是继续运行,应该由被通知的线程自己处理
```java
Thread t1 = new Thread( new Runnable(){
public void run(){
} } ).start();// 若未发生中断,就正常执行任务
while(!Thread.currentThread.isInterrupted()){
// 正常任务代码……
}
// 中断的处理代码……
doSomething();
```
再次说明:调用interrupt()并不是要真正终止掉当前线程,仅仅是设置了一个中断标志。这个中断标志可以给我们用来判断什么时候该干什么活!什么时候中断由我们自己来决定,这样就可以安全地终止线程了!
所以说:interrupt方法压根是不会对线程的状态造成影响的,它仅仅设置一个标志位罢了
interrupt线程中断还有另外两个方法(检查该线程是否被中断):
- 静态方法interrupted()—>会清除中断标志位
- 实例方法isInterrupted()—>不会清除中断标志位
交替打印字符+数字
https://blog.csdn.net/u011514810/article/details/77131296