netty - 理解 Netty 3 中 MemoryAwareThreadPoolExecutor 的行为
问题描述
我想了解Netty 3中MemoryAwareThreadPoolExecutor的行为。
我正在实现java 文档中提供的示例示例,并进行了一些小改动。
我的可运行类
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();
}
}
我期待主类执行规模较大的任务。但我看到每次运行程序时任务总是以随机顺序执行。
程序行为背后的任何解释或原因。
解决方案
基本上只知道任务将占用多少内存,MemoryAwareThreadPoolExecutor
并根据它处理“背压”。它根本与订购无关。
还要注意,Netty 3 是 EOL 很长时间了,你应该使用 4.1。
推荐阅读
- sparql - SPARQL 获取名称/文本而不是标识符作为结果
- sql - 如何查找事务表中仍处于活动状态的记录
- excel - Excel 具有不同结果的多个 IF AND 范围语句
- r - 如何创建有条件的 flexdashboard 布局
- ffmpeg - ffmpeg:无法识别音频输入设备
- excel - 我可以编写一个 Excel 宏来将我的数据放入表格中吗?
- python - 无法理解局部变量和全局变量是如何工作的
- javascript - 如何使用一个函数将数组中的多个特定字符串替换为对象?
- browser - 对于服务器和 Web 客户端之间的高速数据传输,是否有更好的 Web 套接字替代方案?
- python - 将绘图功能导入主脚本时显示绘图