public class ThreadPoolExecutor extends AbstractExecutorService
ExecutorServiceã§ããéåžžã¯Executorsãã¡ã¯ããªã»ã¡ãœããã䜿çšããŠæ§æãããŸãã
ã¹ã¬ããã»ããŒã«ã§ã¯ã2ã€ã®åé¡ã«å¯ŸåŠããŸãããŸããã¿ã¹ã¯åœããã®åŒåºããªãŒããŒããããæžå°ãããããéåžžã¯å€§éã®éåæã¿ã¹ã¯ã®å®è¡æã«ããã©ãŒãã³ã¹ãåäžããŸãããŸããã¿ã¹ã¯ã®ã³ã¬ã¯ã·ã§ã³ãå®è¡ãããšãã«æ¶è²»ããããªãœãŒã¹(ã¹ã¬ãããå«ã)ã®å¢çèšå®ããã³ç®¡çã®ããã®æ¹æ³ãæäŸããŸãã åThreadPoolExecutorãåºæ¬çãªçµ±èšæ
å ±(å®äºããã¿ã¹ã¯ã®æ°ãªã©)ãä¿æããŸãã
å¹
åºãã³ã³ããã¹ãã§æçšã§ããããã«ããã®ã¯ã©ã¹ã§ã¯å€ãã®èª¿æŽå¯èœãªãã©ã¡ãŒã¿ãæ¡åŒµæ§ããã¯ãæäŸããŸãã ãã ãããã°ã©ãã¯ããã䟿å©ãªExecutorsãã¡ã¯ããªã»ã¡ãœããã§ããExecutors.newCachedThreadPool() (èªåã¹ã¬ããåçã®ããã¢ã³ããŠã³ã圢åŒã®ã¹ã¬ããã»ããŒã«)ãExecutors.newFixedThreadPool(int) (åºå®ãµã€ãºã®ã¹ã¬ããã»ããŒã«)ããã³Executors.newSingleThreadExecutor() (åäžããã¯ã°ã©ãŠã³ãã®ã¹ã¬ãã)ã䜿çšããŠãã ããããããã®ãã¡ã¯ããªã»ã¡ãœããã¯ããã£ãšãäžè¬çãªäœ¿çšãæ³å®ããèšå®ãäºåæ§æããŸãã ããã§ãªãå Žåããã®ã¯ã©ã¹ãæåã§èšå®ã調æŽãããšãã¯æ¬¡ã®ã¬ã€ãã«åŸã£ãŠãã ããã
ThreadPoolExecutorã¯ãcorePoolSize (getCorePoolSize()ãåç
§)ãšmaximumPoolSize (getMaximumPoolSize()ãåç
§)ã«ãã£ãŠèšå®ãããå¢çã«åŸã£ãŠãããŒã«ã»ãµã€ãº(getPoolSize()ãåç
§)ãèªåçã«èª¿æŽããŸãã æ°ããã¿ã¹ã¯ãexecute(Runnable)ã¡ãœããã§éä¿¡ãããcorePoolSizeããå°ãªãã¹ã¬ãããå®è¡ãããŠããå Žåã¯ãä»ã®ã¯ãŒã«ãŒã»ã¹ã¬ãããã¢ã€ãã«ç¶æ
ã§ãã£ãŠããèŠæ±ãåŠçããããã«æ°ããã¹ã¬ãããäœæãããŸãã corePoolSizeãããå€ããmaximumPoolSizeãããå°ãªãæ°ã®ã¹ã¬ãããå®è¡äžã§ããå Žåãæ°ããã¹ã¬ãããäœæãããã®ã¯ãã¥ãŒããã£ã±ãã§ããå Žåã ãã§ãã corePoolSizeãšmaximumPoolSizeãåãå€ã«èšå®ãããšãåºå®ãµã€ãºã®ã¹ã¬ããã»ããŒã«ãäœæãããŸãã maximumPoolSizeãInteger.MAX_VALUEãªã©ã®å®è³ªçã«ã¢ã³ããŠã³ã圢åŒã§ããå€ã«èšå®ãããšãããŒã«ã«ä»»æã®æ°ã®äžŠè¡ã¿ã¹ã¯ãæ ŒçŽããããšãã§ããŸãã ã³ã¢ã»ããŒã«ã»ãµã€ãºãšæå€§ããŒã«ã»ãµã€ãºã¯æ§ç¯æã«ã®ã¿èšå®ãããã®ããã£ãšãäžè¬çã§ãããsetCorePoolSize(int)ããã³setMaximumPoolSize(int)ã䜿çšããŠåçã«å€æŽããããšãã§ããŸãã prestartCoreThread()ãŸãã¯prestartAllCoreThreads()ã¡ãœããã䜿çšããŠåçã«ãªãŒããŒã©ã€ãã§ããŸãã 空ã§ãªããã¥ãŒã§ããŒã«ãæ§ç¯ããå Žåã¯ãã¹ã¬ãããäºåã«èµ·åããããšãã§ããŸãã ThreadFactoryã䜿çšããŠäœæãããŸãã ç¹ã«æå®ãããŠããªãå Žåã¯ãExecutors.defaultThreadFactory()ã䜿çšãããŸãããã®å Žåã«äœæãããã¹ã¬ããã¯ããã¹ãŠåãThreadGroupå
ã«ãããåãNORM_PRIORITYåªå
é äœãšéããŒã¢ã³ã»ã¹ããŒã¿ã¹ãæã¡ãŸãã ç°ãªãThreadFactoryãæå®ãããšãã¹ã¬ããã®ååãã¹ã¬ããã»ã°ã«ãŒããåªå
é äœãããŒã¢ã³ã»ã¹ããŒã¿ã¹ãªã©ã倿Žã§ããŸããèŠæ±æã«newThreadããnullãè¿ãããŠThreadFactoryãã¹ã¬ããã®äœæã«å€±æãããšãexecutorã¯ç¶è¡ããŸãããã¿ã¹ã¯ããŸã£ããå®è¡ã§ããªãå¯èœæ§ããããŸãã ã¹ã¬ããã¯ããmodifyThreadãã®RuntimePermissionãææããããã«ããŠãã ããã ããŒã«ã䜿çšããŠããã¯ãŒã«ãŒã»ã¹ã¬ããããã®ä»ã®ã¹ã¬ããããã®ã¢ã¯ã»ã¹æš©ãææããŠããªããšããµãŒãã¹ãäœäžããå ŽåããããŸããæ§æã®å€æŽãã¿ã€ã ãªã«æå¹ã«ãªããªãã£ãããããŒã«ã®ã·ã£ããããŠã³ããçµäºã¯å¯èœã ãå®äºããŠããªãç¶æ
ã®ãŸãŸã«ãªã£ããããå ŽåããããŸãã getKeepAliveTime(TimeUnit)ãåç
§)ã ããã«ãããããŒã«ãã¢ã¯ãã£ãã«äœ¿çšãããŠããªããšãã®ãªãœãŒã¹ã®æ¶è²»éãæžããããšãã§ããŸãã ããŒã«ãããšã§ã¢ã¯ãã£ãã«ãªããšãæ°ããã¹ã¬ãããæ§ç¯ãããŸãã ãŸãããã®ãã©ã¡ãŒã¿ã¯ãsetKeepAliveTime(long, TimeUnit)ã¡ãœããã䜿çšããŠåçã«å€æŽããããšãã§ããŸãã Long.MAX_VALUE TimeUnit.NANOSECONDSã®å€ã䜿çšãããšãã¢ã€ãã«ã»ã¹ã¬ãããã·ã£ããããŠã³åã«çµäºããããšãå®è³ªçã«ç¡å¹ã«ãªããŸãã ããã©ã«ãã§ã¯ãcorePoolSizeã®æ°ããå€ãã®ã¹ã¬ãããååšããå Žåã«ã®ã¿ããŒãã¢ã©ã€ãã»ããªã·ãŒãé©çšããŸãã ãã ããkeepAliveTimeã®å€ã0以å€ã§ããã°ãallowCoreThreadTimeOut(boolean)ã¡ãœããã䜿çšããŠããã®ã¿ã€ã ã¢ãŠãã»ããªã·ãŒãã³ã¢ã»ã¹ã¬ããã«ãé©çšã§ããŸãã BlockingQueueã䜿çšã§ããŸãã ãã®ãã¥ãŒã®äœ¿çšã¯ãããŒã«ã®ãµã€ãºèšå®ãšçžäºã«äœçšããŸãã
SynchronousQueueã§ããããã¯ãæ¬æ¥ã¯ã¿ã¹ã¯ãä¿æããŸãã ãã®å Žåãã¿ã¹ã¯ãå®è¡ããããã«ããã«å©çšã§ããã¹ã¬ããããªããšãã¿ã¹ã¯ããã¥ãŒã«å
¥ããããšãããšãã«å€±æããæ°ããã¹ã¬ãããæ§ç¯ãããŸãã ãã®ããªã·ãŒã«ãããå
éšçãªäŸåé¢ä¿ãæã€å¯èœæ§ãããèŠæ±ã»ããã®åŠçæã«ããã¯ã»ã¢ãããåé¿ãããŸãã äžè¬ã«çŽæ¥ãã³ããªãã§ã¯ãéä¿¡ãããæ°ããã¿ã¹ã¯ãæåŠãããã®ãåé¿ããããã«ãã¢ã³ããŠã³ã圢åŒã®maximumPoolSizesãå¿
èŠã§ãã ããã«ãããå¹³åããŠåŠçèœåãè¶
ããéãã§ã³ãã³ããæ¬¡ã
ã«å°çãããšãã¢ã³ããŠã³ã圢åŒã®ã¹ã¬ããã倧ãããªãå¯èœæ§ããããŸãã LinkedBlockingQueueãªã©)ã䜿çšãããšãcorePoolSizeã®ãã¹ãŠã®ã¹ã¬ãããããžãŒç¶æ
ã§ããå Žåã«ãæ°ããã¿ã¹ã¯ã¯ãã¥ãŒå
ã§åŸ
æ©ããŸãã ããã«ãããcorePoolSizeãè¶
ããã¹ã¬ããã¯äœæãããªããªããŸãã ã€ãŸãmaximumPoolSizeã®å€ã¯å¹æããªããªããŸãã åã¿ã¹ã¯ãå®å
šã«ç¬ç«ããŠãããããã¿ã¹ã¯ãçžäºã®å®è¡ã«åœ±é¿ããªãå Žåã¯ãã®æ¹åŒãé©åã§ããããšããããŸã(WebããŒãžã»ãµãŒããŒã®å Žåãªã©)ã ãã®æ¹åŒã®ãã¥ãŒã€ã³ã°ã¯ãäžæçã«æ¥å¢ããèŠæ±ãåŠçããå Žåãªã©ã¯äŸ¿å©ã§ãããå¹³åããŠåŠçèœåãè¶
ããéãã§ã³ãã³ããæ¬¡ã
ã«å°çãããšãã¢ã³ããŠã³ã圢åŒã®ã¯ãŒã¯ã»ãã¥ãŒã倧ãããªãå¯èœæ§ããããŸãã ArrayBlockingQueueãªã©)ã¯ãéå®ãããmaximumPoolSizesã§äœ¿çšãããšãªãœãŒã¹äžè¶³ãåé¿ã§ããŸããã調æŽãšå¶åŸ¡ãé£ãããªãå¯èœæ§ããããŸãã ãã¥ãŒã»ãµã€ãºãšæå€§ããŒã«ã»ãµã€ãºã¯äºãã«ãã¬ãŒããªãã®é¢ä¿ã«ãªãããšããããŸãã倧ããªãã¥ãŒãšå°ããªããŒã«ã䜿çšãããšãCPU䜿çšçãOSãªãœãŒã¹éãããã³ã³ã³ããã¹ãã»ã¹ã€ããã³ã°ã®ãªãŒããŒãããã¯æå°åãããŸãããã¹ã«ãŒãããã¯å€§å¹
ã«äœäžããå¯èœæ§ããããŸãã ã¿ã¹ã¯ãé »ç¹ã«ãããã¯ããå Žåã¯(å
¥åºåãå¶éãããå Žåãªã©)ãèš±å¯ããŠããã¹ã¬ããæ°ãããå€ãã®ã¹ã¬ããã«å¯ŸããŠãã·ã¹ãã ãæéãã¹ã±ãžã¥ãŒã«ããããšãã§ããŸãã å°ãããã¥ãŒã䜿çšãããšãäžè¬ã«å¿
èŠãªããŒã«ã»ãµã€ãºã¯å€§ãããªããŸããããã«ãããCPUãããããžãŒã«ãªããŸãããé倧ãªã¹ã±ãžã¥ãŒã«èšå®ã®ãªãŒããŒããããçºçããããšããããã¹ã«ãŒããããäœäžããŸãã execute(Runnable)ã¡ãœããã§éä¿¡ãããæ°ããã¿ã¹ã¯ã¯æåŠãããŸãã ãããã®å Žåããexecuteã¡ãœããã¯ããã®RejectedExecutionHandlerã®RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor)ã¡ãœãããåŒã³åºããŸãã äºåå®çŸ©ããã4ã€ã®ãã³ãã©ã»ããªã·ãŒãçšæãããŠããŸãã
ThreadPoolExecutor.AbortPolicyã§ã¯ãæåŠããããšããã³ãã©ã¯å®è¡æã®RejectedExecutionExceptionãã¹ããŒããŸãã ThreadPoolExecutor.CallerRunsPolicyã§ã¯ãexecuteèªäœãåŒã³åºãã¹ã¬ãããã¿ã¹ã¯ãå®è¡ããŸãã ããã«ãããåçŽãªãã£ãŒãã»ããã¯å¶åŸ¡ã¡ã«ããºã ãæäŸãããçµæãšããŠæ°ããã¿ã¹ã¯ã®éä¿¡ã¬ãŒããäœäžããŸãã ThreadPoolExecutor.DiscardPolicyã§ã¯ãå®è¡ã§ããªãã¿ã¹ã¯ãåã«åé€ãããŸãã ThreadPoolExecutor.DiscardOldestPolicyã§ã¯ãexecutorãã·ã£ããããŠã³ããŠããªãå Žåã¯ãã¯ãŒã¯ã»ãã¥ãŒã®å
é ã«ããã¿ã¹ã¯ãåé€ãããããšãå®è¡ãå詊è¡ãããŸã(ããäžåºŠå€±æããå¯èœæ§ãããããã®å Žåã¯ãã®åŠçãç¹°ãè¿ããã)ã RejectedExecutionHandlerã¯ã©ã¹ãå®çŸ©ããŠäœ¿çšããããšãã§ããŸãã ãã®å Žåãç¹å®ã®å®¹éãŸãã¯ãã¥ãŒã€ã³ã°ã»ããªã·ãŒã§ã®ã¿åäœããããã«ããªã·ãŒãèšèšãããŠãããšãã¯ãç¹ã«æ³šæãå¿
èŠã§ãã protectedã®ãªãŒããŒã©ã€ãå¯èœãªbeforeExecute(Thread, Runnable)ã¡ãœãããšafterExecute(Runnable, Throwable)ã¡ãœãããæäŸããŸãããããã®ã¡ãœããã¯ãåã¿ã¹ã¯ãå®è¡ããååŸã«åŒã³åºãããŸãã ãããã®ã¡ãœããã¯ãå®è¡ç°å¢ãæäœããããã«äœ¿çšã§ããŸã(ThreadLocalã®ååæåãçµ±èšæ
å ±ã®åéããã°ã»ãšã³ããªã®è¿œå ãªã©)ã ããã«ãExecutorãå®å
šã«çµäºããåŸã§å®è¡ããå¿
èŠã®ããç¹æ®ãªåŠçããã¹ãŠå®è¡ããããã«ãterminated()ã¡ãœããããªãŒããŒã©ã€ãã§ããŸãã
ããã¯ãŸãã¯ã³ãŒã«ããã¯ã»ã¡ãœãããäŸå€ãã¹ããŒãããšãå éšã®ã¯ãŒã«ãŒã»ã¹ã¬ããã¯å€±æããŠåŒ·å¶çµäºããŸãã
getQueue()ã¡ãœããã䜿çšãããšãç£èŠããããã°ã®ç®çã§ã¯ãŒã¯ã»ãã¥ãŒã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®ä»ã®ç®çã§ãã®ã¡ãœããã䜿çšããªãããšãåŒ·ãæšå¥šãããŠããŸãã æäŸããã2ã€ã®ã¡ãœããremove(Runnable)ãšpurge()ã¯ããã¥ãŒã«å
¥ãããã倿°ã®ã¿ã¹ã¯ãåãæ¶ããããšãã«ãã¹ãã¬ãŒãžã®åçãæ¯æŽããããã«äœ¿çšã§ããŸãã shutdownãå®è¡ãããŸãã ãŠãŒã¶ãŒãshutdown()ã®åŒåºããå¿ãããšãã§ããåç
§ãããŠããªãããŒã«ãåçãããããã«ããå Žåã¯ãæªäœ¿çšã®ã¹ã¬ãããæçµçã«çµäºããããã«èª¿æŽããå¿
èŠããããŸããããã«ã¯ãé©åãªããŒãã¢ã©ã€ãæéãèšå®ãããããŒãã»ã³ã¢ã»ã¹ã¬ããã®äžéã䜿çšããããallowCoreThreadTimeOut(boolean)ãèšå®ãããããŸãã æ¡åŒµæ©èœã®äŸã ãã®ã¯ã©ã¹ã®ã»ãšãã©ã®æ¡åŒµæ©èœã¯ã1ã€ä»¥äžã®protectedããã¯ã»ã¡ãœããããªãŒããŒã©ã€ãããŸãã ããšãã°ã次ã®äŸã¯ãåçŽãªäžæåæ¢ããã³åéã®æ©èœã远å ãããµãã¯ã©ã¹ã§ãã
class PausableThreadPoolExecutor extends ThreadPoolExecutor {
private boolean isPaused;
private ReentrantLock pauseLock = new ReentrantLock();
private Condition unpaused = pauseLock.newCondition();
public PausableThreadPoolExecutor(...) { super(...); }
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
pauseLock.lock();
try {
while (isPaused) unpaused.await();
} catch (InterruptedException ie) {
t.interrupt();
} finally {
pauseLock.unlock();
}
}
public void pause() {
pauseLock.lock();
try {
isPaused = true;
} finally {
pauseLock.unlock();
}
}
public void resume() {
pauseLock.lock();
try {
isPaused = false;
unpaused.signalAll();
} finally {
pauseLock.unlock();
}
}
}| 修食åãšå | ã¯ã©ã¹ | 説æ |
|---|---|---|
static class |
ThreadPoolExecutor.AbortPolicy |
RejectedExecutionExceptionãã¹ããŒããæåŠãããã¿ã¹ã¯ã®ãã³ãã©ã§ãã |
static class |
ThreadPoolExecutor.CallerRunsPolicy |
executorãã·ã£ããããŠã³ããŠããªãå Žåã«ã
executeã¡ãœããã®åŒåºãã¹ã¬ããå
ã§ãæåŠãããã¿ã¹ã¯ãçŽæ¥å®è¡ãããæåŠãããã¿ã¹ã¯ã®ãã³ãã©ã§ããã·ã£ããããŠã³ããŠããå Žåãã¿ã¹ã¯ã¯ç Žæ£ãããŸãã |
static class |
ThreadPoolExecutor.DiscardOldestPolicy |
executorãã·ã£ããããŠã³ããŠããªãå Žåã«ããã£ãšãå€ãæªåŠçã®èŠæ±ãç Žæ£ããŠ
executeãå詊è¡ãããæåŠãããã¿ã¹ã¯ã®ãã³ãã©ã§ããã·ã£ããããŠã³ããŠããå Žåãã¿ã¹ã¯ã¯ç Žæ£ãããŸãã |
static class |
ThreadPoolExecutor.DiscardPolicy |
æåŠãããã¿ã¹ã¯ãéç¥ãªãã§ç Žæ£ããæåŠãããã¿ã¹ã¯ã®ãã³ãã©ã§ãã
|
| ã³ã³ã¹ãã©ã¯ã¿ | 説æ |
|---|---|
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) |
æå®ãããåæãã©ã¡ãŒã¿ãããã³ããã©ã«ãã®ã¹ã¬ããã»ãã¡ã¯ããªãšæåŠãããå®è¡ãã³ãã©ã䜿çšããŠãæ°ãã
ThreadPoolExecutorãäœæããŸãã |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) |
æå®ãããåæãã©ã¡ãŒã¿ãããã³ããã©ã«ãã®ã¹ã¬ããã»ãã¡ã¯ããªã䜿çšããŠãæ°ãã
ThreadPoolExecutorãäœæããŸãã |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) |
æå®ãããåæãã©ã¡ãŒã¿ãããã³ããã©ã«ãã®æåŠãããå®è¡ãã³ãã©ã䜿çšããŠãæ°ãã
ThreadPoolExecutorãäœæããŸãã |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) |
æå®ãããåæãã©ã¡ãŒã¿ã䜿ã£ãŠãæ°ãã
ThreadPoolExecutorãäœæããŸãã |
| 修食åãšå | ã¡ãœãã | 説æ |
|---|---|---|
protected void |
afterExecute(Runnable r, Throwable t) |
æå®ãããRunnableã®å®è¡å®äºæã«åŒã³åºãããã¡ãœããã§ãã
|
void |
allowCoreThreadTimeOut(boolean value) |
ãã®ããŒã«ã§ãããŒãã¢ã©ã€ãæéå
ã«å°çããã¿ã¹ã¯ããªããã°ã³ã¢ã»ã¹ã¬ãããã¿ã€ã ã»ã¢ãŠãããã³çµäºããããšãèš±å¯ãããæ°ããã¿ã¹ã¯ãå°çãããšãã¯å¿
èŠã«å¿ããŠã³ã¢ã»ã¹ã¬ããã眮ãæãããããã©ãããå¶åŸ¡ããããªã·ãŒãèšå®ããŸãã
|
boolean |
allowsCoreThreadTimeOut() |
ãã®ããŒã«ã§ãkeepAliveæéå
ã«å°çããã¿ã¹ã¯ããªããã°ã³ã¢ã»ã¹ã¬ãããã¿ã€ã ã»ã¢ãŠãããã³çµäºããããšãèš±å¯ãããæ°ããã¿ã¹ã¯ãå°çãããšãã¯å¿
èŠã«å¿ããŠã³ã¢ã»ã¹ã¬ããã眮ãæããããå Žåã¯ãtrueãè¿ããŸãã
|
boolean |
awaitTermination(long timeout, TimeUnit unit) |
ã·ã£ããããŠã³èŠæ±åŸã«ãã¹ãŠã®ã¿ã¹ã¯ãå®è¡ãå®äºããŠããããã¿ã€ã ã»ã¢ãŠããçºçããããçŸåšã®ã¹ã¬ããã§å²èŸŒã¿ãçºçãããããã®ãããããæåã«çºçãããŸã§ãããã¯ããŸãã
|
protected void |
beforeExecute(Thread t, Runnable r) |
æå®ãããã¹ã¬ããã§æå®ãããRunnableãå®è¡ããåã«åŒã³åºãããã¡ãœããã§ãã
|
void |
execute(Runnable command) |
å°æ¥ã®ããæç¹ã§æå®ãããã¿ã¹ã¯ãå®è¡ããŸãã
|
protected void |
finalize() |
ãã®executorãåç
§ãããªããªããã¹ã¬ããããªããšãã«
shutdownãåŒã³åºããŸãã |
int |
getActiveCount() |
ã¢ã¯ãã£ãã«ã¿ã¹ã¯ãå®è¡ããŠããã¹ã¬ããã®ãããã®æ°ãè¿ããŸãã
|
long |
getCompletedTaskCount() |
ãããŸã§ã«å®è¡ãå®äºããã¿ã¹ã¯ã®ãããã®ç·æ°ãè¿ããŸãã
|
int |
getCorePoolSize() |
ã¹ã¬ããã®ã³ã¢æ°ãè¿ããŸãã
|
long |
getKeepAliveTime(TimeUnit unit) |
ã³ã¢ã»ããŒã«ã»ãµã€ãºãè¶
ããã¹ã¬ãããçµäºåã«ã¢ã€ãã«ç¶æ
ã«çãŸãããšãã§ãããã¹ã¬ããã®ããŒãã¢ã©ã€ãæéãè¿ããŸãã
|
int |
getLargestPoolSize() |
ããŒã«å
ã«åæã«ååšããæå€§ã¹ã¬ããæ°ãè¿ããŸãã
|
int |
getMaximumPoolSize() |
ã¹ã¬ããã®æå€§èš±å®¹æ°ãè¿ããŸãã
|
int |
getPoolSize() |
ããŒã«å
ã®çŸåšã®ã¹ã¬ããæ°ãè¿ããŸãã
|
BlockingQueue<Runnable> |
getQueue() |
ãã®executorã§äœ¿çšããã¿ã¹ã¯ã»ãã¥ãŒãè¿ããŸãã
|
RejectedExecutionHandler |
getRejectedExecutionHandler() |
å®è¡å¯èœã§ãªãã¿ã¹ã¯ã®çŸåšã®ãã³ãã©ãè¿ããŸãã
|
long |
getTaskCount() |
ãããŸã§ã«å®è¡ãã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ã®ãããã®ç·æ°ãè¿ããŸãã
|
ThreadFactory |
getThreadFactory() |
æ°ããã¹ã¬ããã®äœæã«äœ¿çšããã¹ã¬ããã»ãã¡ã¯ããªãè¿ããŸãã
|
boolean |
isShutdown() |
ãã®executorãã·ã£ããããŠã³ããŠããå Žåã
trueãè¿ããŸãã |
boolean |
isTerminated() |
ã·ã£ããããŠã³ã«ç¶ããŠãã¹ãŠã®ã¿ã¹ã¯ãå®äºããŠããå Žåã
trueãè¿ããŸãã |
boolean |
isTerminating() |
shutdown()ãŸãã¯shutdownNow()ã®ããšã§ãã®executorãçµäºåŠçäžã ããå®å
šã«çµäºããŠããªãå Žåã¯ãtrueãè¿ããŸãã |
int |
prestartAllCoreThreads() |
ãã¹ãŠã®ã³ã¢ã»ã¹ã¬ãããèµ·åããã¢ã€ãã«ç¶æ
ã§åŠçåŸ
ã¡ã«ããŸãã
|
boolean |
prestartCoreThread() |
ã³ã¢ã»ã¹ã¬ãããèµ·åããã¢ã€ãã«ç¶æ
ã§åŠçåŸ
ã¡ã«ããŸãã
|
void |
purge() |
åãæ¶ããããã¹ãŠã®
Futureã¿ã¹ã¯ãã¯ãŒã¯ã»ãã¥ãŒããåé€ããããšããŸãã |
boolean |
remove(Runnable task) |
executorã®å
éšãã¥ãŒã«ãã®ã¿ã¹ã¯ãååšããå Žåã¯åé€ããããããã®ã¿ã¹ã¯ããŸã éå§ãããŠããªãå Žåã¯å®è¡ãããŸããã
|
void |
setCorePoolSize(int corePoolSize) |
ã¹ã¬ããã®ã³ã¢æ°ãèšå®ããŸãã
|
void |
setKeepAliveTime(long time, TimeUnit unit) |
ã¹ã¬ãããçµäºåã«ã¢ã€ãã«ç¶æ
ã«çãŸãããšãã§ããå¶éæéãèšå®ããŸãã
|
void |
setMaximumPoolSize(int maximumPoolSize) |
ã¹ã¬ããã®æå€§èš±å®¹æ°ãèšå®ããŸãã
|
void |
setRejectedExecutionHandler(RejectedExecutionHandler handler) |
å®è¡å¯èœã§ãªãã¿ã¹ã¯ã®æ°ãããã³ãã©ãèšå®ããŸãã
|
void |
setThreadFactory(ThreadFactory threadFactory) |
æ°ããã¹ã¬ããã®äœæã«äœ¿çšããã¹ã¬ããã»ãã¡ã¯ããªãèšå®ããŸãã
|
void |
shutdown() |
é åºæ£ããã·ã£ããããŠã³ãéå§ããŸãã以åã«éä¿¡ãããã¿ã¹ã¯ãå®è¡ãããŸãããæ°èŠã¿ã¹ã¯ã¯åãå
¥ããããŸããã
|
List<Runnable> |
shutdownNow() |
å®è¡äžã®ã¢ã¯ãã£ããªã¿ã¹ã¯ãã¹ãŠã®åæ¢ã詊ã¿ãåŸ
æ©äžã®ã¿ã¹ã¯ã®åŠçã忢ããå®è¡ãåŸ
æ©ããŠããã¿ã¹ã¯ã®ãªã¹ããè¿ããŸãã
|
protected void |
terminated() |
executorãçµäºãããšãã«åŒã³åºãããã¡ãœããã§ãã
|
String |
toString() |
å®è¡ç¶æ
ããã³æšå®ã®ã¯ãŒã«ãŒããã³ã¿ã¹ã¯ã»ã«ãŠã³ãã®æç€ºãå«ããŠããã®ããŒã«ããã³ãã®ç¶æ
ãèå¥ããæååãè¿ããŸãã
|
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submitpublic ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
ThreadPoolExecutorãäœæããŸãã ãã®æ±çšã³ã³ã¹ãã©ã¯ã¿ã®ä»£ããã«ãExecutorsãã¡ã¯ããªã»ã¡ãœããã®ããããã䜿çšããæ¹ã䟿å©ãªå ŽåããããŸãã corePoolSize - allowCoreThreadTimeOutãèšå®ãããŠããªãããããã¢ã€ãã«ã§ãã£ãŠãããŒã«å
ã«ç¶æãããã¹ã¬ããã®æ°maximumPoolSize - ããŒã«å
ã§å¯èœãªã¹ã¬ããã®æå€§æ°keepAliveTime - ã¹ã¬ããã®æ°ãã³ã¢ãããå€ãå Žåãããã¯è¶
éããã¢ã€ãã«ç¶æ
ã®ã¹ã¬ãããæ°ããã¿ã¹ã¯ãåŸ
æ©ããŠããçµäºãããŸã§ã®æå€§æéãunit - keepAliveTimeåŒæ°ã®æéåäœworkQueue - ã¿ã¹ã¯ãå®è¡ããããŸã§ä¿æããããã«äœ¿çšãããã¥ãŒã ãã®ãã¥ãŒã¯ãexecuteã¡ãœããã§éä¿¡ãããRunnableã¿ã¹ã¯ã ããä¿æããã IllegalArgumentException - 次ã®ãããããåœãŠã¯ãŸãå ŽåãcorePoolSize < 0keepAliveTime < 0maximumPoolSize <= 0maximumPoolSize < corePoolSizeNullPointerException - workQueueãnullã§ããå Žåpublic ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
ThreadPoolExecutorãäœæããŸããcorePoolSize - allowCoreThreadTimeOutãèšå®ãããŠããªãããããã¢ã€ãã«ã§ãã£ãŠãããŒã«å
ã«ç¶æãããã¹ã¬ããã®æ°maximumPoolSize - ããŒã«å
ã§å¯èœãªã¹ã¬ããã®æå€§æ°keepAliveTime - ã¹ã¬ããã®æ°ãã³ã¢ãããå€ãå Žåãããã¯è¶
éããã¢ã€ãã«ç¶æ
ã®ã¹ã¬ãããæ°ããã¿ã¹ã¯ãåŸ
æ©ããŠããçµäºãããŸã§ã®æå€§æéãunit - keepAliveTimeåŒæ°ã®æéåäœworkQueue - ã¿ã¹ã¯ãå®è¡ããããŸã§ä¿æããããã«äœ¿çšãããã¥ãŒã ãã®ãã¥ãŒã¯ãexecuteã¡ãœããã§éä¿¡ãããRunnableã¿ã¹ã¯ã ããä¿æããã threadFactory - executorãæ°ããã¹ã¬ãããäœæãããšãã«äœ¿çšãããã¡ã¯ããªIllegalArgumentException - 次ã®ãããããåœãŠã¯ãŸãå ŽåãcorePoolSize < 0keepAliveTime < 0maximumPoolSize <= 0maximumPoolSize < corePoolSizeNullPointerException - workQueueãŸãã¯threadFactoryãnullã®å Žåpublic ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
ThreadPoolExecutorãäœæããŸããcorePoolSize - allowCoreThreadTimeOutãèšå®ãããŠããªãããããã¢ã€ãã«ã§ãã£ãŠãããŒã«å
ã«ç¶æãããã¹ã¬ããã®æ°maximumPoolSize - ããŒã«å
ã§å¯èœãªã¹ã¬ããã®æå€§æ°keepAliveTime - ã¹ã¬ããã®æ°ãã³ã¢ãããå€ãå Žåãããã¯è¶
éããã¢ã€ãã«ç¶æ
ã®ã¹ã¬ãããæ°ããã¿ã¹ã¯ãåŸ
æ©ããŠããçµäºãããŸã§ã®æå€§æéãunit - keepAliveTimeåŒæ°ã®æéåäœworkQueue - ã¿ã¹ã¯ãå®è¡ããããŸã§ä¿æããããã«äœ¿çšãããã¥ãŒã ãã®ãã¥ãŒã¯ãexecuteã¡ãœããã§éä¿¡ãããRunnableã¿ã¹ã¯ã ããä¿æããã handler - ã¹ã¬ããã®å¢çããã³ãã¥ãŒã®å®¹éã«éãããããå®è¡ããããã¯ããããšãã«äœ¿çšãããã³ãã©IllegalArgumentException - 次ã®ãããããåœãŠã¯ãŸãå ŽåãcorePoolSize < 0keepAliveTime < 0maximumPoolSize <= 0maximumPoolSize < corePoolSizeNullPointerException - workQueueãŸãã¯handlerãnullã®å Žåpublic ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
ThreadPoolExecutorãäœæããŸããcorePoolSize - allowCoreThreadTimeOutãèšå®ãããŠããªãããããã¢ã€ãã«ã§ãã£ãŠãããŒã«å
ã«ç¶æãããã¹ã¬ããã®æ°maximumPoolSize - ããŒã«å
ã§å¯èœãªã¹ã¬ããã®æå€§æ°keepAliveTime - ã¹ã¬ããã®æ°ãã³ã¢ãããå€ãå Žåãããã¯è¶
éããã¢ã€ãã«ç¶æ
ã®ã¹ã¬ãããæ°ããã¿ã¹ã¯ãåŸ
æ©ããŠããçµäºãããŸã§ã®æå€§æéãunit - keepAliveTimeåŒæ°ã®æéåäœworkQueue - ã¿ã¹ã¯ãå®è¡ããããŸã§ä¿æããããã«äœ¿çšãããã¥ãŒã ãã®ãã¥ãŒã¯ãexecuteã¡ãœããã§éä¿¡ãããRunnableã¿ã¹ã¯ã ããä¿æããã threadFactory - executorãæ°ããã¹ã¬ãããäœæãããšãã«äœ¿çšãããã¡ã¯ããªhandler - ã¹ã¬ããã®å¢çããã³ãã¥ãŒã®å®¹éã«éãããããå®è¡ããããã¯ããããšãã«äœ¿çšãããã³ãã©IllegalArgumentException - 次ã®ãããããåœãŠã¯ãŸãå ŽåãcorePoolSize < 0keepAliveTime < 0maximumPoolSize <= 0maximumPoolSize < corePoolSizeNullPointerException - workQueueãŸãã¯threadFactoryãŸãã¯handlerãnullã®å Žåpublic void execute(Runnable command)
RejectedExecutionHandlerã«ãã£ãŠåŠçãããŸãã command - å®è¡ããã¿ã¹ã¯RejectedExecutionException - RejectedExecutionHandlerã®å€æã§ãã¿ã¹ã¯ãå®è¡ã®ããã«åãå
¥ããããšãã§ããªãå ŽåNullPointerException - commandãnullã§ããå Žåpublic void shutdown()
ãã®ã¡ãœããã¯ã以åã«éä¿¡ãããã¿ã¹ã¯ãå®è¡ãå®äºããã®ãåŸ
æ©ããŸããã ãããå®è¡ããã«ã¯ãawaitTerminationã䜿ã£ãŠãã ããã
SecurityException - ã»ãã¥ãªãã£ã»ãããŒãžã£ãååšããç¶æ³ã§ãã®ExecutorServiceã®ã·ã£ããããŠã³ãå®è¡ãããšãåŒåºãåŽã«ã¯å€æŽãèš±å¯ããªãã¹ã¬ãããæäœã§ããå Žåãããã¯ãRuntimePermission("modifyThread")ãä¿æããªãããã»ãã¥ãªãã£ã»ãããŒãžã£ã®checkAccessã¡ãœãããã¢ã¯ã»ã¹ãæåŠããããã§ãããpublic List<Runnable> shutdownNow()
ãã®ã¡ãœããã¯ãã¢ã¯ãã£ãã«å®è¡äžã®ã¿ã¹ã¯ãçµäºããã®ãåŸ
æ©ããŸããã ãããå®è¡ããã«ã¯ãawaitTerminationã䜿ã£ãŠãã ããã
å®è¡äžã®ã¢ã¯ãã£ããªã¿ã¹ã¯åŠçã忢ããããã«æåã®åªåãããããšä»¥äžã®ä¿èšŒã¯ãããŸããã ãã®å®è£
ã§ã¯ãThread.interrupt()ãä»ããŠã¿ã¹ã¯ãåãæ¶ããããå²ã蟌ã¿ã«å¯Ÿããå¿çã«å€±æããã¿ã¹ã¯ã¯çµäºããªããªãå¯èœæ§ããããŸãã
SecurityException - ã»ãã¥ãªãã£ã»ãããŒãžã£ãååšããç¶æ³ã§ãã®ExecutorServiceã®ã·ã£ããããŠã³ãå®è¡ãããšãåŒåºãåŽã«ã¯å€æŽãèš±å¯ããªãã¹ã¬ãããæäœã§ããå Žåãããã¯ãRuntimePermission("modifyThread")ãä¿æããªãããã»ãã¥ãªãã£ã»ãããŒãžã£ã®checkAccessã¡ãœãããã¢ã¯ã»ã¹ãæåŠããããã§ãããpublic boolean isShutdown()
ExecutorServicetrueãè¿ããŸããtruepublic boolean isTerminating()
shutdown()ãŸãã¯shutdownNow()ã®ããšã§ãã®executorãçµäºåŠçäžã ããå®å
šã«çµäºããŠããªãå Žåã¯ãtrueãè¿ããŸãã ãã®ã¡ãœããã¯ãããã°ã«äŸ¿å©ãªããšããããŸãã ã·ã£ããããŠã³åŸã«ååãªæéãçµã£ãŠããå ±åãããtrueã®æ»ãå€ã¯ãéä¿¡ãããã¿ã¹ã¯ãå²èŸŒã¿ãç¡èŠãŸãã¯æå¶ããããã«ããã®executorãé©åã«çµäºãããªãããšã瀺ãå¯èœæ§ããããŸãã truepublic boolean isTerminated()
ExecutorServicetrueãè¿ããŸãã shutdownãŸãã¯shutdownNowã®ãããããæåã«åŒã³åºãããå Žåãé€ããisTerminatedãtrueã«ãªãããšã¯ãããŸããã truepublic boolean awaitTermination(long timeout,
TimeUnit unit)
throws InterruptedException
ExecutorServicetimeout - åŸ
æ©ããæé·æéunit - timeoutåŒæ°ã®æéåäœtrueãçµäºåã«ã¿ã€ã ã»ã¢ãŠããçµéããå Žåã¯falseInterruptedException - åŸ
æ©äžã«å²èŸŒã¿ãçºçããå Žåprotected void finalize()
shutdownãåŒã³åºããŸããfinalizeãã¯ã©ã¹ObjectWeakReference, PhantomReferencepublic void setThreadFactory(ThreadFactory threadFactory)
threadFactory - æ°ããã¹ã¬ããã»ãã¡ã¯ããªNullPointerException - threadFactoryãnullã®å ŽågetThreadFactory()public ThreadFactory getThreadFactory()
setThreadFactory(ThreadFactory)public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
handler - æ°ãããã³ãã©NullPointerException - ãã³ãã©ãnullã®å ŽågetRejectedExecutionHandler()public RejectedExecutionHandler getRejectedExecutionHandler()
setRejectedExecutionHandler(RejectedExecutionHandler)public void setCorePoolSize(int corePoolSize)
corePoolSize - æ°ããã³ã¢ã»ãµã€ãºIllegalArgumentException - corePoolSize < 0ã®å ŽågetCorePoolSize()public int getCorePoolSize()
setCorePoolSize(int)public boolean prestartCoreThread()
falseãè¿ããŸãã truepublic int prestartAllCoreThreads()
public boolean allowsCoreThreadTimeOut()
trueããã以å€ã®å Žåã¯falsepublic void allowCoreThreadTimeOut(boolean value)
trueã«èšå®ãããšãã¯ãããŒãã¢ã©ã€ãæéããŒãããã倧ããããå¿
èŠããããŸãã éåžžã¯ããã®ã¡ãœãããåŒã³åºããŠãããããŒã«ãã¢ã¯ãã£ãã«äœ¿çšããŠãã ããã value - ã¿ã€ã ã»ã¢ãŠãããããã«ããå Žåã¯trueããã以å€ã®å Žåã¯falseIllegalArgumentException - å€ãtrueã§ãçŸåšã®ããŒãã¢ã©ã€ãæéã0以äžã®å Žåpublic void setMaximumPoolSize(int maximumPoolSize)
maximumPoolSize - æ°ããæå€§å€IllegalArgumentException - æ°ããæå€§å€ã0以äžãããŸãã¯ã³ã¢ã»ããŒã«ã»ãµã€ãºããå°ããå ŽågetMaximumPoolSize()public int getMaximumPoolSize()
setMaximumPoolSize(int)public void setKeepAliveTime(long time,
TimeUnit unit)
time - åŸ
æ©ããæéã timeå€ããŒãã®å Žåã¯ãã¿ã¹ã¯ãå®è¡ãããšããã«è¶
éããã¹ã¬ãããçµäºããã unit - timeåŒæ°ã®æéåäœIllegalArgumentException - timeã0ããå°ããå ŽåããŸãã¯timeã0ã§allowsCoreThreadTimeOutã®å ŽågetKeepAliveTime(TimeUnit)public long getKeepAliveTime(TimeUnit unit)
unit - æ»ãå€ã«æå®ããæéåäœsetKeepAliveTime(long, TimeUnit)public BlockingQueue<Runnable> getQueue()
public boolean remove(Runnable task)
ãã®ã¡ãœããã¯åæ¶ãæ¹åŒã®äžéšãšããŠäŸ¿å©ãªããšããããŸãã å
éšãã¥ãŒã«é
眮ãããåã«å¥ã®åœ¢åŒã«å€æãããã¿ã¹ã¯ã¯ãåé€ã«å€±æããå¯èœæ§ããããŸãã ããšãã°ãsubmitã䜿çšããŠå
¥ãã¿ã¹ã¯ã¯ãFutureç¶æ
ãç¶æãã圢åŒã«å€æãããããšããããŸãã ãã ãããã®å Žåã¯ãpurge()ã¡ãœããã䜿çšããŠãåãæ¶ãããFutureãåé€ããããšãã§ããŸãã
task - åé€ããã¿ã¹ã¯truepublic void purge()
Futureã¿ã¹ã¯ãã¯ãŒã¯ã»ãã¥ãŒããåé€ããããšããŸãã ãã®ã¡ãœããã¯ãæ©èœã«ãã®ä»ã®åœ±é¿ã®ãªããèšæ¶é åã®åçãªãã¬ãŒã·ã§ã³ãšããŠäŸ¿å©ãªããšããããŸãã åãæ¶ãããã¿ã¹ã¯ãå®è¡ãããããšã¯ãããŸããããã¯ãŒã«ãŒã»ã¹ã¬ãããã¢ã¯ãã£ãã«åé€ãããŸã§ã¯ãŒã¯ã»ãã¥ãŒå
ã«èç©ãããå ŽåããããŸãã ãã®ã¡ãœãããåŒã³åºããšããã ã¡ã«åé€ããããšããŸãã ãã ãããã®ä»ã®ã¹ã¬ããã«ããå¹²æžãååšããå Žåã¯ããã®ã¡ãœããã¯ã¿ã¹ã¯ã®åé€ã«å€±æããããšããããŸãã public int getPoolSize()
public int getActiveCount()
public int getLargestPoolSize()
public long getTaskCount()
public long getCompletedTaskCount()
public String toString()
protected void beforeExecute(Thread t, Runnable r)
rãå®è¡ããã¹ã¬ããtã«ãã£ãŠåŒã³åºãããThreadLocalã®ååæåããã®ã³ã°ã®å®è¡ã«äœ¿çšãããå ŽåããããŸãã
ãã®å®è£
ã¯åŠçãè¡ããŸãããããµãã¯ã©ã¹ã§ã«ã¹ã¿ãã€ãºããããšã¯å¯èœã§ãã ããŒã: è€æ°ã®ãªãŒããŒã©ã€ããé©åã«å
¥ãåã«ãããããéåžžã¯ããµãã¯ã©ã¹ã§ã¯ãã®ã¡ãœããã®æåŸã§super.beforeExecuteãåŒã³åºãããã«ããŠãã ããã
t - ã¿ã¹ã¯rãå®è¡ããã¹ã¬ããr - å®è¡ãããã¿ã¹ã¯protected void afterExecute(Runnable r, Throwable t)
RuntimeExceptionãŸãã¯Errorã§ãã
ãã®å®è£
ã¯åŠçãè¡ããŸãããããµãã¯ã©ã¹ã§ã«ã¹ã¿ãã€ãºããããšã¯å¯èœã§ãã ããŒã: è€æ°ã®ãªãŒããŒã©ã€ããé©åã«å
¥ãåã«ãããããéåžžããµãã¯ã©ã¹ã§ã¯ãã®ã¡ãœããã®æåã§super.afterExecuteãåŒã³åºãããã«ããŠãã ããã
ããŒã: ã¢ã¯ã·ã§ã³ãæç€ºçã«ããŸãã¯submitãªã©ã®ã¡ãœããã«ãã£ãŠãã¿ã¹ã¯(FutureTaskãªã©)å
ã«åãŸãå Žåããããã®ã¿ã¹ã¯ã»ãªããžã§ã¯ãã¯èšç®ã®äŸå€ããã£ããããŠç¶æããŸãããã®ãããç°åžžçµäºããããšã¯ãªããå
éšäŸå€ã¯ãã®ã¡ãœããã«æž¡ãããŸããã ãã®ã¡ãœããã§äž¡æ¹ã®çš®é¡ã®å€±æããã©ããããå Žåã¯ãã¿ã¹ã¯ã匷å¶çã«äžæ¢ãããå Žåã®çŽæ¥ã®åå ãŸãã¯åå ãšãªã£ãäŸå€ã®ã©ã¡ãããåºåãããã®ãµã³ãã«ã»ãµãã¯ã©ã¹ã®ããã«ããã®ãããªã±ãŒã¹ãããã«èª¿ã¹ãããšãã§ããŸãã
class ExtendedExecutor extends ThreadPoolExecutor {
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}r - å®äºããRunnablet - çµäºã®åå ãšãªã£ãäŸå€ãå®è¡ãæ£åžžã«å®äºããå Žåã¯nullprotected void terminated()
super.terminatedãåŒã³åºãããã«ããŠãã ããã ãã°ãŸãã¯æ©èœãéä¿¡
詳现ãªAPIãªãã¡ã¬ã³ã¹ããã³éçºè
ããã¥ã¡ã³ãã«ã€ããŠã¯ãJava SEã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ããã¥ã¡ã³ãã«ã¯ãæŠå¿µçãªæŠèŠãçšèªã®å®çŸ©ãåé¿æ¹æ³ãæå¹ãªã³ãŒãäŸãªã©ã®ãéçºè
ã察象ã«ãããã詳现ãªèª¬æãå«ãŸããŠããŸãã
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyãåç
§ããŠãã ããã