Join
主线程join一个线程,那么主线程会阻塞直到join进来的线程执行完,主线程继续执行, join如果带超时时间的话,那么如果超时的话主线程也会不再等join进去的线程而继续执行.
join实际就是判断join进来的线程存活状态,如果活着就调用wait(0),如果带超时时间了的话,wait里边的时间会算出来
while (isAlive()) {wait(0);}
API
- public final void join() throws InterruptedException
- public final synchronized void join(long millis, int nanos)
public final synchronized void join(long millis)
Demo
```java public class JoinThread {
public static void main(String[] args) throws InterruptedException {
JoinT joinT = new JoinT();for (int i = 0; i < 50; i++) {if (i == 10) {joinT.start();joinT.join();}//执行完join的线程后继续执行主线程System.out.println(Thread.currentThread().getName() + "--" + i);}
} }
class JoinT extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+”—“+i); } } }
<a name="ZVQ4t"></a># Sleep睡觉方法,也可以理解为暂停一段时间,**注意**与wait()不同的是sleep并不会让线程释放锁<a name="DI8m9"></a>### API- public static native void sleep(long millis) throws InterruptedException- public static void sleep(long millis, int nanos) throws InterruptedException<a name="yCbRJ"></a># Yield也是让线程暂停一下,但是是进入就绪状态,让掉当前线程CPU的时间片,让系统重新开始一次新的调度过程```javaThread.yield()
yield 和 sleep 的异同
1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。
2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。
3)yield 不能被中断,而 sleep 则可以接受中断。
中断
Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。
前面有一些方法声明了InterruptedException, 这意味者他们可以被中断,中断后把异常抛给调用方,让调用方自己处理.
被中断的线程可以自已处理中断,也可以不处理或者抛出去。
