代码备忘录

 
List 迭代
private final List<Entry> entries = new CopyOnWriteArrayList<Entry>();

for (ListIterator<Entry> i = entries.listIterator(); i.hasNext();) {
Entry base = i.next();
if (base.getName().equals(baseName)) {
register(i.previousIndex(), new EntryImpl(name, filter));
break;
}
}



确认一个参数是否为空
if (name == null) {
throw new IllegalArgumentException("name");
}




非静态内部类调为外部类
public void addAfter(String name, IoFilter filter) {
DefaultIoFilterChainBuilder.this.addAfter(getName(), name, filter);
}




异常处理类
public class DefaultExceptionMonitor extends ExceptionMonitor {
private final static Logger LOGGER = LoggerFactory.getLogger(DefaultExceptionMonitor.class);

/**
* {@inheritDoc}
*/
@Override
public void exceptionCaught(Throwable cause) {
if (cause instanceof Error) {
throw (Error) cause;
}

LOGGER.warn("Unexpected exception.", cause);
}
}



异常单例句柄
public abstract class ExceptionMonitor {
private static ExceptionMonitor instance = new DefaultExceptionMonitor();

/**
* Returns the current exception monitor.
*/
public static ExceptionMonitor getInstance() {
return instance;
}

/**
* Sets the uncaught exception monitor. If <code>null</code> is specified,
* the default monitor will be set.
*
* @param monitor A new instance of {@link DefaultExceptionMonitor} is set
* if <tt>null</tt> is specified.
*/
public static void setInstance(ExceptionMonitor monitor) {
if (monitor == null) {
monitor = new DefaultExceptionMonitor();
}

instance = monitor;
}

/**
* Invoked when there are any uncaught exceptions.
*
* @param cause The caught exception
*/
public abstract void exceptionCaught(Throwable cause);
}

 name thread
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.mina.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* A {@link Runnable} wrapper that preserves the name of the thread after the runnable is
* complete (for {@link Runnable}s that change the name of the Thread they use.)
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class NamePreservingRunnable implements Runnable {
private final static Logger LOGGER = LoggerFactory.getLogger(NamePreservingRunnable.class);

/** The runnable name */
private final String newName;

/** The runnable task */
private final Runnable runnable;

/**
* Creates a new instance of NamePreservingRunnable.
*
* @param runnable The underlying runnable
* @param newName The runnable's name
*/
public NamePreservingRunnable(Runnable runnable, String newName) {
this.runnable = runnable;
this.newName = newName;
}

/**
* Run the runnable after having renamed the current thread's name
* to the new name. When the runnable has completed, set back the
* current thread name back to its origin.
*/
public void run() {
Thread currentThread = Thread.currentThread();
String oldName = currentThread.getName();

if (newName != null) {
setName(currentThread, newName);
}

try {
runnable.run();
} finally {
setName(currentThread, oldName);
}
}

/**
* Wraps {@link Thread#setName(String)} to catch a possible {@link Exception}s such as
* {@link SecurityException} in sandbox environments, such as applets
*/
private void setName(Thread thread, String name) {
try {
thread.setName(name);
} catch (SecurityException se) {
if (LOGGER.isWarnEnabled()) {
LOGGER.warn("Failed to set the thread name.", se);
}
}
}
}



检查死锁

private void checkDeadLock() {
// Only read / write / connect / write future can cause dead lock.
if (!(this instanceof CloseFuture || this instanceof WriteFuture ||
this instanceof ReadFuture || this instanceof ConnectFuture)) {
return;
}

// Get the current thread stackTrace.
// Using Thread.currentThread().getStackTrace() is the best solution,
// even if slightly less efficient than doing a new Exception().getStackTrace(),
// as internally, it does exactly the same thing. The advantage of using
// this solution is that we may benefit some improvement with some
// future versions of Java.
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

// Simple and quick check.
for (StackTraceElement s: stackTrace) {
if (AbstractPollingIoProcessor.class.getName().equals(s.getClassName())) {
IllegalStateException e = new IllegalStateException( "t" );
e.getStackTrace();
throw new IllegalStateException(
"DEAD LOCK: " + IoFuture.class.getSimpleName() +
".await() was invoked from an I/O processor thread. " +
"Please use " + IoFutureListener.class.getSimpleName() +
" or configure a proper thread model alternatively.");
}
}

// And then more precisely.
for (StackTraceElement s: stackTrace) {
try {
Class<?> cls = DefaultIoFuture.class.getClassLoader().loadClass(s.getClassName());
if (IoProcessor.class.isAssignableFrom(cls)) {
throw new IllegalStateException(
"DEAD LOCK: " + IoFuture.class.getSimpleName() +
".await() was invoked from an I/O processor thread. " +
"Please use " + IoFutureListener.class.getSimpleName() +
" or configure a proper thread model alternatively.");
}
} catch (Exception cnfe) {
// Ignore
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值