代码之家  ›  专栏  ›  技术社区  ›  user51

在netty 3中理解memoryawarethreadpoolexecutor的行为

  •  0
  • user51  · 技术社区  · 7 年前

    我想了解 MemoryAwareThreadPoolExecutor 在荨麻3。

    我正在实现中提供的示例 java docs 小的变化。

    我的可运行类

    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();
          }
      }
    

    我希望主类执行较大的任务。但我看到每次运行程序时,任务总是以随机顺序执行。

    程序行为背后的任何解释或原因。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Norman Maurer    7 年前

    这个 MemoryAwareThreadPoolExecutor 基本上只知道一个任务需要多少内存,并根据它处理“背压”。这和订货一点关系都没有。

    还要注意,netty 3已经下线很长一段时间了,您应该使用4.1。