zoukankan      html  css  js  c++  java
  • Java多线程之线程结束清理

    该事例说明了清理工作必须要放在finally块中

    package Thread.Interrupting;
    
    import java.util.concurrent.TimeUnit;
    
    class NeedsCleanup {
        private final int id;
    
        public NeedsCleanup(int ident) {
            id = ident;
            System.out.println("NeedsCleanup " + id);
        }
    
        public void cleanup() {
            System.out.println("Cleaning up " + id);
        }
    }
    
    class Blocked3 implements Runnable {
        private volatile double d = 0.0;
    
        @Override
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    NeedsCleanup n1 = new NeedsCleanup(1);
                    try {
                        System.out.println("Sleeping");
                        TimeUnit.SECONDS.sleep(1);
                        // point2
                        NeedsCleanup n2 = new NeedsCleanup(2);
                        // Guarantee proper cleanup of n2:
                        try {
                            System.out.println("Calculating");
                            // A time-consuming,non-blocking operation:
                            for (int i = 0; i < 2500000; i++) {
                                d = d + (Math.PI + Math.E) / d;
                            }
                            System.out.println("Finished time-consuming operation");
                        } finally {
                            n2.cleanup();
                        }
                    } finally {
                        n1.cleanup();
                    }
                    System.out.println("Exiting via while() test");
                }
            } catch (InterruptedException e) {
                System.out.println("Exiting via InterruptedException");
            }
        }
    }
    
    public class InterruptingIdiom {
        public static void main(String[] args) throws NumberFormatException,
                InterruptedException {
            if (args.length != 1) {
                System.out.println("usage:java InterruptingIdiom delay-in-ms");
                System.exit(1);
            }
            Thread t = new Thread(new Blocked3());
            t.start();
            TimeUnit.MILLISECONDS.sleep(new Integer(args[0]));
            t.interrupt();
        }
    
    }
  • 相关阅读:
    qt 数据库操作总结
    Pro*C编程研究一:从.pc到.exe
    通过OCCI连接oracle(C++)
    数据库操作通用类
    一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
    如何卸载oracle11g
    ORA-12541:TNS:无监听程序
    Qt 线程基础(QThread、QtConcurrent等) 2
    QThreadPool类和QtConcurrent命名空间
    AE 向已存在的要素类中添加字段
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3756234.html
Copyright © 2011-2022 走看看