线程简介

一、作用

二、概念

2. 线程的生命周期

生命周期

3. 中断

中断:可以理解为线程的一个标志位属性

5. 线程间通信

(1)synchronized/volatile

(2)等待/通知机制

(3)join()

三、使用

1. 创建线程的方法

创建线程的3种方法

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;
        }
    }
}

4. 『等待超时模式』

5. 一些小例子

打印内容为 12a34b56c78e...

四、重点说明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。