zoukankan      html  css  js  c++  java
  • Java多线程之线程中断

    该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断。

    package Thread.Interrupting;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    
    class SleepBlocked implements Runnable {
        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(100);
            } catch (Exception e) {
                System.out.println("InterruptedException");
            }
            System.out.println("Exiting SleepBlocked.run()");
        }
    }
    
    class IOBlocked implements Runnable {
        private InputStream in;
    
        public IOBlocked(InputStream is) {
            in = is;
        }
    
        @Override
        public void run() {
            try {
                System.out.println("Waiting for read():");
                in.read();
            } catch (IOException e) {
                //判断线程是否被打断了
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Interrupted from blocked I/O");
                } else {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("Exiting IOBlocked.run()");
        }
    }
    
    class SynchronizedBlocked implements Runnable {
        public synchronized void f() {
            while (true)
                Thread.yield();
        }
    
        public SynchronizedBlocked() {
            new Thread() {
                public void run() {
                    f();
                }
            }.start();
        }
    
        @Override
        public void run() {
            System.out.println("Trying to call f()");
            f();//试图中断已经处于锁定的代码
            System.out.println("Exiting SynchronizedBlocked.run()");
        }
    }
    
    public class Interrupting {
        private static ExecutorService exec = Executors.newCachedThreadPool();
    
        static void test(Runnable r) throws InterruptedException {
            Future<?> f = exec.submit(r);
            TimeUnit.MILLISECONDS.sleep(1000);
            System.out.println("Interrupting " + r.getClass().getName());
            f.cancel(true);
            System.out.println("Interrupt sent to " + r.getClass().getName());
        }
    
        public static void main(String[] args) throws InterruptedException {
       test(new SleepBlocked());

        test(new IOBlocked(System.in));
        test(new SynchronizedBlocked());

            TimeUnit.SECONDS.sleep(3);

            System.out.println("Aborting with System.exit(0)");

          System.exit(0);
        }
    }
  • 相关阅读:
    正则,ant antd from验证input框只能输入数字
    React 实现简易轮播图
    Moment.js ,JavaScript 日期处理类库
    JavaScript中准确的判断数据类型--四种方法
    介绍:一款可以描绘圆圈进度条的jQuery插件(可用作统计图)
    给网页增加水印的方法,react
    IntelliJ IDEA创建web项目及异常问题解决
    CSS 代码是什么?(转)
    JSP入门:介绍什么是JSP和Servlet(转)
    INTELLIJ IDEA集成CHECKSTYLE(转)
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3756057.html
Copyright © 2011-2022 走看看