以下のコードでは、私の主なタスクは、サブタスクが実行を完了するのを待っていません。私はJava Threadを初めて使用しています。だから私はそれを修正することができませんでした。私はそれをgoogleと運が見つかりませんでした。このスレッドの問題を修正するのを手伝ってください。 コード:Javaマルチスレッドの問題
class ExecutorServiceManager{
public static ExecutorService getExecutor() {
if (executorService == null) {
try {
lock.lock();
if (executorService == null) {
executorService = Executors.newFixedThreadPool(150);
}
} finally {
lock.unlock();
}
}
if(executorService instanceof ThreadPoolExecutor) {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;
int corePoolSize = threadPoolExecutor.getCorePoolSize();
int maximumPoolSize = threadPoolExecutor.getMaximumPoolSize();
Logger.info(ExecutorServiceManager.class, "ExecutorInfo: CorePoolSize:%s, MaxPoolSize:%s", corePoolSize, maximumPoolSize);
}
return executorService;
}}
class ServiceImpl{
ExecutorServiceManager executorServiceManager;
private void processConversion(String category, Map<String, String> couchDeltaMap, String processKey, String reqId) {
try {
ProgressVo progressVo = new ProgressVo();
CountDownLatch pgCntxtcountDownLatch = new CountDownLatch(1);
executorServiceManager.getExecutor().submit(new MainTask(category, processKey, pgCntxtcountDownLatch, executorServiceManager, progressVo));
Logger.info(ServiceImpl.class, "ExecutorInfo: CorePoolSize:%s, MaxPoolSize:%s", corePoolSize, maximumPoolSize);
pgCntxtcountDownLatch.await();
} catch(InterruptedException ie) {}
catch(Exception ex) {}
}}
class MainTask implements Runnable{
@Override
public void run() {
executorService = executorServiceManager.getExecutor();
executorService.submit(new SubTask(progressVo, couchDeltaMap, reqId, executorServiceManager));
//I want the below operation to be executed, if and only the subtask completed its execution.
//But the below logger is printing before the subtask completed its execution.
Logger.info(MainTask.class, "It got executed before the subtask completed its processing");
pgCntxtcountDownLatch.countDown();
}}
class SubTask implements Runnable{
@Override
public void run() {
executorService = executorServiceManager.getExecutor();
doSomeProcess;
//It stopped in the middle, and the Main task started executing the remaining operation
}}
ダブルチェックロックがない限り、壊れていますいずれにしてもダブルチェックロックを使用しないでください。不要な二重チェックのイディオムが正しく機能することを確認するための手順を実行しましたか? –
あなたがJavaスレッドに慣れていないなら、私は基本的なスレッドクラスに固執します。メカニックが理解できれば、使いやすいクラスを使うことができます。 – efekctive