exit.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 161 行

JAVA
161
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.util;import java.util.ArrayList;/** * The exit class is used to automatically clean state.  For example, * Resin JavaScript will close open files when the script exits. * * Here's a sample use: * <pre> *   boolean isExit = addExit(); *   try { *     ... *   } finally { *     if (isExit) *       exit(); *   } * </pre> * * <p>Objects register for the exit callback by calling * <code>addExit(listener, object)</code>. * * <p>Exits are intrinsically tied to a thread. */public class Exit {  static private ThreadLocal<Queue> _waiting = new ThreadLocal<Queue>();  private Exit() {}  /**   * Registers the object and listener.  The listener will be called when   * the thread exits the scope.   *   * <p>If there is no protection scope, i.e. addExit() hasn't been called,   * then this function does nothing.   *   * @param listener the exit handler   * @param object the object which needs cleanup   */  static public void addExit(ExitListener listener, Object object)  {    Queue queue = _waiting.get();    if (queue != null)      queue.add(listener, object);  }  /**   * Starts a protection scope.  Only the outermost scope is important, so   * protecting routines must check the return value to see if they are the   * outermost scope.   *   * @return true if this is the outermost scope.   */  static public boolean addExit()  {    Queue queue = _waiting.get();    if (queue == null) {      queue = Queue.allocate();      _waiting.set(queue);      return true;    } else       return false;  }  /**   * Calls all registered listeners.   */  static public void exit()  {    Queue queue = null;    queue = _waiting.get();    _waiting.set(null);    if (queue == null)      return;        int size = queue._listeners.size();    for (int i = 0; i < size; i++) {      ExitListener listener = queue._listeners.get(i);      Object object = queue._objects.get(i);      if (listener != null) {	try {	  listener.handleExit(object);	} catch (Exception e) {	}      }    }    queue.free();  }  private static class Queue {    static Queue _freeList;    Queue _next;    ArrayList<ExitListener> _listeners = new ArrayList<ExitListener>();    ArrayList<Object> _objects = new ArrayList<Object>();    private Queue()    {    }    void add(ExitListener listener, Object object)    {      _listeners.add(listener);      _objects.add(object);    }    static Queue allocate()    {      if (_freeList == null) 	return new Queue();      Queue queue = _freeList;      _freeList = _freeList._next;      return queue;    }    void free()    {      _listeners.clear();      _objects.clear();      _next = _freeList;      _freeList = this;    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?