マルチスレッドコードで発生count
する数を調べています。exceptions
そのために私がしたことはaddException
、AtomicInteger
.
addException
メソッドは 2 つのパラメーターを受け入れます。one is the String
その他は、boolean flag
例外のためにプログラムを終了するかどうかを意味します。つまり、そのフラグが true の場合、例外が発生するたびにプログラムを終了する必要があります。
したがって、下のcatch
ブロックを見るaddException
と、例外をカウントするためのメソッド呼び出しがあり、そのメソッド呼び出しの下にも例外が記録されています。
ExecutorService service = Executors.newFixedThreadPool(threads);
for (int i = 0; i < threads; i++) {
service.submit(new ReadTask());
}
class ReadTask implements Runnable {
public static ConcurrentHashMap<String, AtomicInteger> exceptionMap = new ConcurrentHashMap<String, AtomicInteger>();
public ReadTask() {
}
@Override
public run() {
try {
.........
} catch (ClassNotFoundException e) {
addException(e.getCause() != null ? e.getCause().toString() : e.toString(), Read.flagTerminate);
LOG.error("Threw a ClassNotFoundException in " + getClass().getSimpleName(), e);
} catch (SQLException e) {
addException(e.getCause() != null ? e.getCause().toString() : e.toString(), Read.flagTerminate);
LOG.error("Threw a SQLException while making connection to database in " + getClass().getSimpleName(), e);
}
}
/**
* A simple method that will add the count of exceptions and name of
* exception to a map
*
* @param cause
* @param flagTerminate
*/
private static void addException(String cause, boolean flagTerminate) {
AtomicInteger count = exceptionMap.get(cause);
if (count == null) {
count = new AtomicInteger();
AtomicInteger curCount = exceptionMap.putIfAbsent(cause, count);
if (curCount != null) {
count = curCount;
}
}
count.incrementAndGet();
if(flagTerminate) {
System.exit(1);
}
}
}
問題文:-
このコードで可能なスレッド競合はありますか? はいの場合、addException
回避するためのより良い方法でメソッドを作成するにはどうすればよいThread Contention
ですか?
ここでメソッドを記述するより効率的なaddException
方法はありますか?