Можно ли повторить этот код N раз?

Поскольку это очень популярная тема, и хорошие ответы распространяются повсюду и рассматриваются в большой степени, я счел оправданным составить хорошие ответы от других в более сжатые формы, так что новички имеют простой обзор upfront:

  1. Обычно вы добавляете класс для добавления или изменения функциональности. Итак, , если вы не хотите, чтобы перезаписывал любое поведение Thread, используйте Runnable.
  2. В том же свете , если вам не нужно чтобы наследовать методы потоков, вы можете обойтись без этих накладных расходов, используя Runnable.
  3. Одиночное наследование: если вы расширяете Thread, вы не можете распространяться ни на один другой класс, поэтому, если это то, что вам нужно сделать, вам нужно используйте Runnable.
  4. Хороший дизайн для разделения логики домена с помощью технических средств, в этом смысле лучше иметь задачу Runnable, изолирующую вашу задачу от вашего бегуна.
  5. Вы можете выполнить один и тот же объект Runnable несколько раз, объект Thread, однако, может быть запущен только один раз. (Может быть, причина, по которой Исполнители принимают Runnables, но не Threads.)
  6. Если вы разрабатываете свою задачу как Runnable, у вас есть все гибкость, как ее использовать сейчас и в будущем. Вы можете запустить его одновременно с помощью Executors, но также через Thread. И вы все равно можете использовать / вызывать его не одновременно в пределах одного потока, как и любой другой обычный тип / объект.
  7. Это также упрощает разделение задач логики и параллелизма в модульных тестах.
  8. Если вас интересует этот вопрос, вас также может заинтересовать разница между Callable и Runnable .

1
задан user11245230 28 March 2019 в 17:42
поделиться

1 ответ

Попробуйте следующий запрос: это ваш запрос, но он немного изменен для целей тестирования (он не использует таблицу ABC и генерирует только 10 строк, используя предложение CONNECT BY LEVEL <= 10 - но вы можете заменить 10 на 1000)

WITH My_Query As (
        select random_group, count(random_group) as freq
        from
              (select case when rand_num >= 0 and rand_num<=0.053 then 1
                          when rand_num > 0.053 and rand_num <= 0.097 then 2
                          when rand_num > 0.097 and rand_num <= 0.142 then 3
                          when rand_num > 0.142 and rand_num <= 0.189 then 4
                          when rand_num > 0.189 and rand_num <= 0.234 then 5
                          when rand_num > 0.234 and rand_num <= 0.281 then 6
                          when rand_num > 0.281 and rand_num <= 0.341 then 7
                          when rand_num > 0.341 and rand_num <= 0.399 then 8
                          when rand_num > 0.399 and rand_num <= 0.458 then 9
                          when rand_num > 0.458 and rand_num <= 0.515 then 10
                          when rand_num > 0.515 and rand_num <= 1.000 then 11 end 
                          random_group
              from
                    (SELECT dbms_random.value(0,1) AS rand_num, 
                            rownum as at_row_num
                     FROM dual
                     CONNECT BY LEVEL <= 10))
        group by random_group
        order by random_group
)
SELECT * FROM (
        SELECT level as test_number FROM dual
        CONNECT BY LEVEL <= 100
) row_generator,
LATERAL (
    SELECT * FROM My_Query WHERE row_generator.test_number = row_generator.test_number
) x
; 

Кстати: этот пункт WHERE row_generator.test_number = row_generator.test_number представляется излишним, но без этого вы получите неправильные результаты - одни и те же записи повторяются 100 раз вместо случайных данных для каждого теста.

0
ответ дан krokodilko 28 March 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: