Сон () хорошая идея для основного цикла планирующего задание приложения

Если вы используете этот способ, вам не нужно импортировать какие-либо сторонние классы.

Если вы хотите объединить String

Пример кода для объединения двух строковых массивов

public static String[] combineString(String[] first, String[] second){
        int length = first.length + second.length;
        String[] result = new String[length];
        System.arraycopy(first, 0, result, 0, first.length);
        System.arraycopy(second, 0, result, first.length, second.length);
        return result;
    }

Если вы хотите объединить Int

Пример кода для конкатенации двух целочисленных массивов

public static int[] combineInt(int[] a, int[] b){
        int length = a.length + b.length;
        int[] result = new int[length];
        System.arraycopy(a, 0, result, 0, a.length);
        System.arraycopy(b, 0, result, a.length, b.length);
        return result;
    }

Вот метод Main

    public static void main(String[] args) {

            String [] first = {"a", "b", "c"};
            String [] second = {"d", "e"};

            String [] joined = combineString(first, second);
            System.out.println("concatenated String array : " + Arrays.toString(joined));

            int[] array1 = {101,102,103,104};
            int[] array2 = {105,106,107,108};
            int[] concatenateInt = combineInt(array1, array2);

            System.out.println("concatenated Int array : " + Arrays.toString(concatenateInt));

        }
    }  

Мы также можем использовать этот способ.

8
задан Yoann Le Touche 24 July 2009 в 18:25
поделиться

5 ответов

Спящий режим подходит для быстрых и грязных вещей . Но для вещей, которым требуется немного большей устойчивости или надежности, я предполагаю, что сон - это зло :) Проблема со сном в том, что поток (я предполагаю, что здесь Windows ...) действительно спит - планировщик не будет запускать поток до истечения некоторого времени по истечении интервала сна.

В течение этого времени поток ни от чего не просыпается. Это означает, что его нельзя отменить или разбудить для обработки какого-либо события. Конечно, процесс можно убить, но это не дает спящей нити возможности проснуться и что-нибудь очистить.

Я не знаком с Ruby, но полагаю, что в нем есть какое-то средство ожидания нескольких вещей. Если вы можете, я предлагаю вместо использования спящего режима использовать две вещи: \

  1. Таймер, который периодически будит поток для выполнения своей работы.
  2. Событие, которое устанавливается, когда процессу необходимо отменить или полностью ( захват Control-C например).

Было бы даже лучше, если бы было какое-то событие, которое можно было бы использовать, чтобы сигнализировать о необходимости выполнить работу. Это позволит избежать опроса по таймеру. Обычно это приводит к более низкому использованию ресурсов и более отзывчивой системе.

но я предполагаю, что у него есть какое-то средство ожидания нескольких вещей. Если вы можете, я предлагаю вместо использования спящего режима использовать две вещи: \

  1. Таймер, который периодически будит поток для выполнения своей работы.
  2. Событие, которое устанавливается, когда процессу необходимо отменить или полностью ( например, захват Control-C).

Было бы даже лучше, если бы было какое-то событие, которое можно было бы использовать, чтобы сигнализировать о необходимости выполнить работу. Это позволит избежать опроса по таймеру. Обычно это приводит к более низкому использованию ресурсов и более отзывчивой системе.

но я предполагаю, что у него есть какое-то средство ожидания нескольких вещей. Если вы можете, я предлагаю вместо использования спящего режима использовать две вещи: \

  1. Таймер, который периодически будит поток для выполнения своей работы.
  2. Событие, которое устанавливается, когда процессу необходимо отменить или полностью ( захват Control-C например).

Было бы даже лучше, если бы было какое-то событие, которое можно было бы использовать, чтобы сигнализировать о необходимости выполнить работу. Это позволит избежать опроса по таймеру. Обычно это приводит к более низкому использованию ресурсов и более отзывчивой системе.

Было бы даже лучше, если бы было какое-то событие, которое можно было бы использовать, чтобы сигнализировать о необходимости выполнить работу. Это позволит избежать опроса по таймеру. Обычно это приводит к более низкому использованию ресурсов и более отзывчивой системе.

Было бы даже лучше, если бы было какое-то событие, которое можно было бы использовать, чтобы сигнализировать о необходимости выполнить работу. Это позволит избежать опроса по таймеру. Обычно это приводит к более низкому использованию ресурсов и более отзывчивой системе.

6
ответ дан 5 December 2019 в 07:59
поделиться

Каждый раз, когда я чувствую необходимость заблокировать, я использую цикл событий; обычно либев. Вот привязка Ruby:

http://rev.rubyforge.org/rdoc/

В принципе, sleep отлично подойдет, если вы хотите, чтобы ваш процесс переходил в спящий режим, не выполняя никаких действий. на заднем плане. Если вы когда-нибудь захотите сделать что-то еще, например, спать, а также дождаться, пока TCP-соединения или дескриптор файла станут читаемыми, вам придется использовать цикл событий. Так почему бы просто не использовать его в начале?

Поток вашего приложения будет следующим:

main {
   Timer->new( after => 0, every => 60 seconds, run => { <do your work> } )
   loop();
}

Когда вы хотите сделать что-то другое, вы просто создаете наблюдатель, и это происходит за вас. (Выполняемые вами задания также могут создавать наблюдателей.)

7
ответ дан 5 December 2019 в 07:59
поделиться

Если вам не нужен точный интервал, это имеет для меня смысл. Если вам нужно регулярно просыпаться без дрейфа, вы, вероятно, захотите использовать какой-то внешний таймер. Но когда вы спите, вы не используете ресурсы процессора. Это дорогой переключатель задач.

3
ответ дан 5 December 2019 в 07:59
поделиться

Хотя спящий режим (тайм-аут) идеально подходит для некоторых проектов, следует иметь в виду одно важное предостережение.

Ruby устанавливает обработчики сигналов с помощью SA_RESTART (см. здесь ), что означает, что ваш сон (или эквивалентный select (nil, nil, nil, timeout) ) не может быть легко прерван. Ваш обработчик сигнала сработает, но программа вернется обратно в спящий режим . Это может быть неудобно, если вы хотите своевременно отреагировать, скажем, на SIGTERM .

Учтите, что ...

#! /usr/bin/ruby
Signal.trap("USR1") { puts "Hey, wake up!" }
Process.fork() { sleep 2 and Process.kill("USR1", Process.ppid) }
sleep 30
puts "Zzz.  I enjoyed my nap."

... выполнение займет около 30 секунд, а не 2.

В качестве обходного пути вы можете вместо этого вызвать исключение в обработчике сигнала, которое прервало бы сон (или что-то еще!), Описанное выше. Вы также можете переключиться на цикл на основе select и использовать вариант трюка self-pipe для «раннего» пробуждения при получении сигнала. Как отмечали другие, также доступны полнофункциональные библиотеки событий.

3
ответ дан 5 December 2019 в 07:59
поделиться

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

2
ответ дан 5 December 2019 в 07:59
поделиться
Другие вопросы по тегам:

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