哪个线程对象调用这个join方法,表示哪个线程进入执行的状态,等待这个线程把它的任务执行完。
让调用的线程先执行指定时间或执行完毕后再执行其他的线程
应用场景:当主线程执行到一半,需要线程0返回的数据才能继续执行时。
package com.chocus.demo1;
public class ThreadDemo02 {
public static void main(String[] args) {
MyRunnables mr = new MyRunnables();
Thread t = new Thread(mr);
t.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(i == 5){
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class MyRunnables implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果:
main--0
Thread-0--0
main--1
Thread-0--1
main--2
Thread-0--2
main--3
Thread-0--3
main--4
Thread-0--4
main--5
Thread-0--5
Thread-0--6
Thread-0--7
Thread-0--8
Thread-0--9
main--6
main--7
main--8
main--9
中断分为正常中断和异常中断
interrupt中断线程并不能真正使线程中断,而是做了一个中断的标记
interrupted方法会清除线程的中断标记,调用一次后就会清除
sleep方法因为线程中断而抛出异常的同时会清除线程的中断标记
package com.chocus.demo1;
public class ThreadDemo03 {
public static void main(String[] args) {
MyRunnable03 mr = new MyRunnable03();
Thread t = new Thread(mr);
t.start();
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (i == 10) {
t.interrupt();
}
}
}
}
class MyRunnable03 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(Thread.currentThread().getName() + "当前中断状态为:" + Thread.interrupted());
boolean flag = Thread.interrupted();
System.out.println(flag);
if (flag) {
break;
}
System.out.println(Thread.currentThread().getName() + "--" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
结果
main--0
Thread-0当前中断状态为:false
false
Thread-0--0
main--1
Thread-0当前中断状态为:false
false
Thread-0--1
Thread-0当前中断状态为:false
main--2
false
Thread-0--2
Thread-0当前中断状态为:false
false
Thread-0--3
main--3
Thread-0当前中断状态为:false
false
Thread-0--4
main--4
Thread-0当前中断状态为:false
main--5
false
Thread-0--5
main--6
Thread-0当前中断状态为:false
false
Thread-0--6
Thread-0当前中断状态为:false
false
Thread-0--7
main--7
main--8
Thread-0当前中断状态为:false
false
Thread-0--8
main--9
Thread-0当前中断状态为:false
false
Thread-0--9
main--10
Thread-0当前中断状态为:false
false
Thread-0--10
Thread-0当前中断状态为:false
main--11
true
main--12
main--13
main--14
main--15
main--16
main--17
main--18
main--19
上面的方式会受到线程执行速度及执行权的影响,并不一定会百分百成功中断。下面才用推荐的自定义的中断标记
package com.chocus.demo1;
public class ThreadDemo04 {
public static void main(String[] args) {
MyRunnable04 mr = new MyRunnable04();
Thread t = new Thread(mr);
t.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "==" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (i == 10) {
mr.flag = false;
}
}
}
}
class MyRunnable04 implements Runnable {
public boolean flag = true;
public MyRunnable04() {
flag = true;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (flag) {
System.out.println(Thread.currentThread().getName() + "--" + i);
} else {
break;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
结果
main==0
Thread-0--0
main==1
Thread-0--1
Thread-0--2
main==2
Thread-0--3
main==3
main==4
Thread-0--4
main==5
Thread-0--5
main==6
Thread-0--6
main==7
Thread-0--7
main==8
Thread-0--8
main==9
Thread-0--9
main==10
Thread-0--10
main==11
main==12
main==13
main==14
main==15
main==16
main==17
main==18
main==19