美文网首页
Java并发编程基础(二)启动和终止线程

Java并发编程基础(二)启动和终止线程

作者: 珍珠林 | 来源:发表于2017-06-04 21:59 被阅读0次

    通过调用线程的start()方法进行启动,随着run()方法的执行完毕,线程也随之终止。

    一、启动线程


    线程对象在初始化完成后,调用start()方法就可以启动这个线程。线程start()方法的含义是:当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。

    启动一个线程前,最好为这个线程命名,方便用jstack等工具分析程序进行问题排查。

    二、理解中断


    中断好比其他线程对该线程打了个招呼,前天线程通过调用该线程的interrupt()方法对其进行中断操作。
    线程通过isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识进行复位。
    从Java的API中可以看到,许多声明抛出InterruptedException的方法(例如Thread.sleep(long millis)方法)在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()方法将会返回false。
    通过下面的示例可以证明:

    public class Interrupted {
        
        public static void main(String[] args) throws Exception {
            // sleepThread不停的尝试睡眠
            Thread sleepThread = new Thread(new SleepRunner(), "SleepThread");
            sleepThread.setDaemon(true);
            // busyThread不停的运行
            Thread busyThread = new Thread(new BusyRunner(), "BusyThread");
            busyThread.setDaemon(true);
            sleepThread.start();
            busyThread.start();
            // 休眠5秒, 让sleepThread和busyThread充分运行
            TimeUnit.SECONDS.sleep(5);
            sleepThread.interrupt();
            busyThread.interrupt();
            System.out.println("SleepThread interrupted is " + sleepThread.isInterrupted());
            System.out.println("BusiThread interrupted is " + busyThread.isInterrupted());
            // 防止sleepThread和busiThread立即退出
            SleepUtils.second(2);
        }
        
        static class SleepRunner implements Runnable {
            @Override
            public void run() {
                while (true) {
                    SleepUtils.second(10);
                }
            }
        }
        
        static class BusyRunner implements Runnable {
            @Override
            public void run() {
                while (true) {
                    
                }
            }
        }
    
    }
    

    输出如下:

    SleepThread interrupted is false
    BusyThread interrupted is true
    

    三、安全地终止线程


    除中断操作外,还可以利用boolean变量来控制是否需要停止任务并终止该线程。
    示例代码,创建了一个线程CountThread,它不断地进行变量累加,而主线程尝试对其进行中断操作和停止操作:

    public class Shutdown {
        
        public static void main(String[] args) throws Exception {
            Runner one = new Runner();
            Thread countThread = new Thread(one, "CountThread");
            countThread.start();
            // 睡眠1秒, main线程对CountThread进行中断, 使CountThread能够感知中断而结束
            TimeUnit.SECONDS.sleep(1);
            countThread.interrupt();
            
            Runner two = new Runner();
            countThread = new Thread(two, "CountThread");
            countThread.start();
            // 睡眠1秒, main线程对Runner two进行取消, 使CountThread能够感知on为false而结束
            TimeUnit.SECONDS.sleep(1);
            two.cancel();
        }
        
        private 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;
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Java并发编程基础(二)启动和终止线程

          本文链接:https://www.haomeiwen.com/subject/gzfbfxtx.html