一、作用
二、概念
2. 线程的生命周期
3. 中断
中断:可以理解为线程的一个标志位属性
5. 线程间通信
(1)synchronized/volatile
(2)等待/通知机制
(3)join()
三、使用
1. 创建线程的方法
2. 线程的暂停、恢复、停止
(1)过期的suspend()
、resume()
、stop()
这些API是过时的,不建议使用。
suspend()
:在调用后,线程不会释放已经占有的资源(比如锁),而是占着资源进入睡眠状态,容易引发死锁问题。
stop()
:终止线程时不会保证线程的资源正常释放,会导致程序可能工作在不确定状态下
正是因为这些方法带来的副作用,这些方法才被标注为过时方法,而暂停、恢复操作可用后面提到的等待/通知机制来代替
(2)安全地终止线程
中断是线程的一个标志位,中断操作是一种简便的线程间交互方式,而这种交互方式最适合用来取消或停止任务。
标志位的方式
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);
// 标志位方式
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;
// 标志位
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;
}
}
}
这种通过标志位或中断操作的方式能够使线程在终止时有机会清理资源,而不是武断地将线程停止,这种做法更优雅。
3. 『每隔1s做一些事情』
通过
Thread.sleep()
实现
public class ScheduleThread {
/**
* 每隔1s打印一行数据
*/
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;
}
}
}