私は以下のように例外を得ました:
2013-10-22 15:16:12 SEVERE Thread-247(247) AspectJExceptionCatcher java.lang.SecurityException: You can not modify this map
at org.apache.harmony.security.fortress.SecurityUtils.putContext(SecurityUtils.java:78)
at java.lang.Thread.create(Thread.java:499)
at java.lang.Thread.<init>(Thread.java:205)
at com.common.conn.ConnectTask.<init>(ConnectTask.java:80)
at com.common.conn.CommuTask.<init>(CommuTask.java:43)
at com.common.conn.ConnectionService$3.sendMsg(ConnectionService.java:144)
at com.business.favorite.FavorManager.getFolderSong(FavorManager.java:243)
at com.business.favorite.FavorManager$6.onResult(FavorManager.java:1465)
at com.common.conn.CommuTask.handleData(CommuTask.java:237)
at com.common.conn.CommuTask.run(CommuTask.java:209)
SecurityUtils.java コードを読んだ後、エラーはスレッドが既に存在することが原因です。そして、私のコードにはそのようなロジックがあります。CommnuTask はスレッドであり、その run() 関数フローで、そのタイプの別のスレッドを作成しようとします。なぜこれが禁止されているのですか?そして、それを修正する方法は?どうもありがとう。
public static void putContext(Thread thread, AccessControlContext context)
throws SecurityException {
if (thread == null) {
throw new NullPointerException("thread can not be null");
}
synchronized (ACC_CACHE) {
if (ACC_CACHE.containsKey(thread)) {
throw new SecurityException("You can not modify this map.");
}
if (context == null) {
// this only allowed once - for the very first thread.
if (ACC_CACHE.containsValue(null)) {
throw new Error("null context may be stored only once.");
}
}
ACC_CACHE.put(thread, context);
}
}