Próbuję zrozumieć klasy ThreadPoolExecutor. Przeczytałem to: answer i Javadoc. Ale moje eksperymenty nie zgadza się z tym opisem:Jak działa funkcja MaximumPoolSize ThreadPoolExecutor?
zainicjować puli wątków z fabryki do śledzenia identyfikatory
int tcounter = 0;
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(1000), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new mThread(tcounter++, r);
}
});
public class mThread extends Thread {
int id;
private mThread(int id, Runnable run) {
super(run);
GLog.e("created thread " + id);
this.id = id;
}
}
następnie zadanie:
public class mRunanble implements Runnable {
int value = 0;
private mRunanble(int value) {
super();
this.value = value;
}
@Override
public void run() {
SystemClock.sleep(3000);
Thread t = Thread.currentThread();
if (t instanceof mThread) {
GLog.e("Say " + (value) + " on thread " + ((mThread) t).id);
}
}
}
i przypisać przycisk a działanie :
executor.execute(new mRunanble(i++));
Ale spamuję ten przycisk, a trzeci wątek nigdy nie jest tworzony, więc co jest dla drugiego parametru w konstruktorze ThreadPoolExecutor (maximumPoolSize=4
). Widziałem 4 wątki do utworzenia i 2 z nich do zabicia po 1 minucie zakończenia wykonywania
Co jest 'Runa'? 'mRunanble'? – Jeffrey
Tak, przepraszam, to jest teraz edytowane – Addev
czy to dlatego, że twoje wątki śpią? być może zmiana twojego działania, aby zrobić zajęte czekanie da ci wynik, którego oczekujesz. – happymeal