sleep()
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SystemClock.sleep(2000);
sleep()方法会使线程睡眠,交出CPU给其他线程使用。
注意:sleep()方法不会释放锁。
上述第二个方法为Android独有,两者的区别就为是否catch InterruptedException,欲知该异常的作用,请见interrupt()方法。先说结果,该方法屏蔽了interrupt通知。
interrupt()
Thread thread = new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000000; i++) {
if (Thread.interrupted()) {
// 收尾
return;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
// 收尾
return;
}
}
}
};
thread.start();
SystemClock.sleep(1000);
thread.interrupt();
了解interrupt()之前,我们先讲一下被弃用的stop()方法。
stop()方法调用后会立即结束线程,而不管线程此时在做何事情。这就会引发不可预知的问题,假如线程正在对一个int型变量赋值,刚写完高位地址准备写低位地址,此时stop()方法来了,线程停止,那这个变量的值可就天知道了。
所以,请使用interrupt()方法代替stop()方法。
interrupt()方法不会立即结束线程,而会通知线程“你需要中断了”,那么线程接收到中断通知后,什么时候执行呢?有三种情况:
- Thread.interrupted()
interrupted()方法会拦截该通知,让用户进行一系列收尾工作。 - InterruptedException
还记得上面sleep()方法中的异常吗?就是这个货。这货会在线程是空闲的情况下拦截该通知并进行收尾工作,毕竟线程空闲着,也不会搞事情。
注意:这可不是报错,并不是所有的异常都是错误信息。 - 线程:“哦,我接收到了”,然后就没有然后了。
wait()/notify()/notifyAll()
private synchronized void initString() {
sharedString = "Woong === ";
notifyAll();
//notify()
}
private synchronized void printString() {
//不能是if,因为notify()后会直接执行wait()后面的代码,可能会造成判断失效
while (sharedString == null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("String: " + sharedString);
}
当线程执行wait()后,线程会释放锁,并进入到阻塞。
当收到notify()方法后,该线程会等待获取锁,获取锁后则会执行wait()之后的代码段。
当有多个线程(同一个锁)进入wait()时,notify()只会通知一个线程,其他线程继续wait()。要想通知所有线程,需使用notifyAll()。
wait()方法会释放锁。
join()
假设有两个线程thread1和thread2,在thread1中调用thread2.join(),则会让thread1阻塞,开始执行thread2,只有当thread2结束后,才会继续运行。
可以简单的概括为,join()方法让线程串行运行。
join()内部调用了wait()方法,所以会释放锁。
yield()
该方法很少用到,它会让线程停一下,对,就是停一下。然后让同优先级的线程工作一下。