理解Netty 3中MemoryWareThreadPoolExecutor的行为

理解Netty 3中MemoryWareThreadPoolExecutor的行为,netty,threadpool,threadpoolexecutor,Netty,Threadpool,Threadpoolexecutor,我想了解Netty 3中的行为 我正在实现中提供的示例,并做了一些小改动 我的跑步课 class MyRunnable implements Runnable { private final byte[] data; public byte[] getData() { return data; } public MyRunnable(byte[] data) { this.data = data; } pu

我想了解Netty 3中的行为

我正在实现中提供的示例,并做了一些小改动

我的跑步课

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();
      }
  }
主要课程是

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();
      }
  }
我希望主类执行较大的任务。但每次我运行程序时,任务总是以随机顺序执行

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

MemoryWareThreadPoolExecutor基本上只知道任务将占用多少内存,并根据任务处理背压。这与订购毫无关系

另外请注意,Netty 3在很长一段时间内都是EOL,您应该使用4.1