一登失、作用
二嫂冻、概念
2. 線程的生命周期
3. 中斷
中斷:可以理解為線程的一個(gè)標(biāo)志位屬性
5. 線程間通信
(1)synchronized/volatile
(2)等待/通知機(jī)制
(3)join()
三汇鞭、使用
1. 創(chuàng)建線程的方法
2. 線程的暫停婆廊、恢復(fù)帜讲、停止
(1)過(guò)期的suspend()
其弊、resume()
癞己、stop()
這些API是過(guò)時(shí)的,不建議使用梭伐。
suspend()
:在調(diào)用后痹雅,線程不會(huì)釋放已經(jīng)占有的資源(比如鎖),而是占著資源進(jìn)入睡眠狀態(tài)糊识,容易引發(fā)死鎖問(wèn)題绩社。
stop()
:終止線程時(shí)不會(huì)保證線程的資源正常釋放,會(huì)導(dǎo)致程序可能工作在不確定狀態(tài)下
正是因?yàn)檫@些方法帶來(lái)的副作用赂苗,這些方法才被標(biāo)注為過(guò)時(shí)方法愉耙,而暫停、恢復(fù)操作可用后面提到的等待/通知機(jī)制來(lái)代替
(2)安全地終止線程
中斷是線程的一個(gè)標(biāo)志位拌滋,中斷操作是一種簡(jiǎn)便的線程間交互方式朴沿,而這種交互方式最適合用來(lái)取消或停止任務(wù)。
標(biāo)志位的方式
public class StopThread {
public static void main(String[] args) throws InterruptedException {
// 中斷方式
Runner one = new Runner();
Thread tOne = new Thread(one, "interrpted one");
tOne.start();
TimeUnit.SECONDS.sleep(3);
tOne.interrupt();
TimeUnit.SECONDS.sleep(3);
// 標(biāo)志位方式
Runner two = new Runner();
Thread tTwo = new Thread(two, "cancel");
tTwo.start();
TimeUnit.SECONDS.sleep(3);
two.cancel();
TimeUnit.SECONDS.sleep(3);
}
static class Runner implements Runnable {
private long i;
// 標(biāo)志位
private volatile boolean on = true;
@Override
public void run() {
while (on && !Thread.currentThread().isInterrupted()) {
i++;
}
System.out.println("Count i=" + i);
}
public void cancel() {
on = false;
}
}
}
這種通過(guò)標(biāo)志位或中斷操作的方式能夠使線程在終止時(shí)有機(jī)會(huì)清理資源败砂,而不是武斷地將線程停止赌渣,這種做法更優(yōu)雅。
3. 『每隔1s做一些事情』
通過(guò)
Thread.sleep()
實(shí)現(xiàn)
public class ScheduleThread {
/**
* 每隔1s打印一行數(shù)據(jù)
*/
static class Runner implements Runnable {
private volatile boolean enable = true;
@Override
public void run() {
while (enable) {
try {
Thread.sleep(1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println("Run at " + sdf.format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setEnable(boolean enable) {
this.enable = enable;
}
}
}