понимание поведения MemoryAwareThreadPoolExecutor в Netty 3 - PullRequest
0 голосов
/ 31 мая 2018

Я хочу понять поведение 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();
      }
  }

Я ожидаю, что основной классвыполнять задачи, которые больше по размеру.но я вижу, что задачи всегда выполняются в случайном порядке каждый раз, когда я запускаю программу.

Любое объяснение или причина, лежащая в основе поведения программы.

1 Ответ

0 голосов
/ 12 июня 2018

MemoryAwareThreadPoolExecutor в основном просто знает о том, сколько памяти займет задача, и в зависимости от нее обрабатывает "обратное давление".Это не имеет никакого отношения к оформлению заказа.

Также обратите внимание, что Netty 3 долгое время является EOL, вы должны использовать 4.1.

...