package com.roocon.thread.tb2;
public class Demo {
public void a(Thread joinThread) {
System.out.println("方法a执行了...");
joinThread.start();
try {
joinThread.join();//加塞join了
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("a方法执行完毕...");
}
public void b() {
System.out.println("加塞线程开始执行....");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("加塞线程执行完毕...");
}
public static void main(String[] args) {
Demo demo = new Demo();
Thread joinThread = new Thread(new Runnable() {
@Override
public void run() {
demo.b();
}
});
new Thread(new Runnable() {
@Override
public void run() {
demo.a(joinThread);
}
}).start();
}
}
原理:
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {//加塞线程joinThread活着
wait(0);//wait锁的什么东西是synchronized当前锁的对象 wait是调用a方法的线程,是调用加塞线程的线程 哪个线程调用的就锁哪个线程
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
如何定义alive呢?
sleep也算是活着的。执行完destory会唤醒所有的等待线程。调用线程自身的notifyAll方法。
---------------------35-------------------------