Я хочу понять поведение MemoryAwareThreadPoolExecutor в Netty 3.
Я реализую пример, представленный в java docs с небольшими изменениями.
Мой класс Runnable
class MyRunnable implements Runnable {
private final byte[] data;
public byte[] getData() {
return data;
}
public MyRunnable(byte[] data) {
this.data = data;
}
public void run() {
String dataString = new String(data, 0, data.length);
System.out.println("Started processing data " + dataString);
try {
TimeUnit.MILLISECONDS.sleep(3000);
//Thread.sleep(3000);
} catch (InterruptedException ie){
ie.printStackTrace();
}
System.out.println("Done processing data " + dataString);
}
}
Класс MyObjectSizeEstimator
class MyObjectSizeEstimator extends DefaultObjectSizeEstimator {
@Override
public int estimateSize(Object o) {
if (o instanceof MyRunnable) {
return ((MyRunnable) o).getData().length;
}
return super.estimateSize(o);
}
}
Главный класс
public class MemoryAwareThreadPoolExecutorDemo {
public static void main(String[] args) {
ThreadPoolExecutor pool = new MemoryAwareThreadPoolExecutor(
16, 65536, 1048576, 30, TimeUnit.SECONDS,
new MyObjectSizeEstimator(),
Executors.defaultThreadFactory());
String[] dataArray = new String[10];
for(int i = 0; i < dataArray.length; ++i) {
dataArray[i] = RandomStringUtils.randomAlphanumeric((i + 1) ) + " " + i;
}
for(int i = 0; i < dataArray.length; ++i) {
pool.execute(new MyRunnable(dataArray[i].getBytes()));
}
while(pool.getActiveCount() != 0) {
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
pool.shutdown();
}
}
Я ожидаю, что основной классвыполнять задачи, которые больше по размеру.но я вижу, что задачи всегда выполняются в случайном порядке каждый раз, когда я запускаю программу.
Любое объяснение или причина, лежащая в основе поведения программы.