Выполнение Потока Java в интервалах

Чтобы очистить текущую ячейку памяти массива, используйте: 'myArray.length = 0' или 'myArray.pop() UN-till its length is 0'

  • length : вы можете установить свойство length для усечения массива в любое время. Когда вы расширяете массив, изменяя его свойство length, число фактических элементов увеличивается.
  • pop() : метод pop удаляет последний элемент из массива и возвращает его удаленное значение.
  • shift() : метод сдвига удаляет элемент с нулевым индексом и сдвигает значения в последовательных индексах вниз, а затем возвращает удаленное значение.

Пример:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] Создайте массив с новой ячейкой памяти с помощью Array constructor или array literal.
    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
    
  • slice() : Используя функцию среза, мы получаем мелкую копию элементов из исходного массива, с новым адресом памяти, так что любая модификация на cloneArr не повлияет на фактический исходный массив.
    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);
    

16
задан Epitaph 9 January 2009 в 01:36
поделиться

3 ответа

Я нахожу, что ScheduledExecutorService является отличным способом сделать это. Это возможно немного более сложно, чем Timer, но дает больше гибкости в обмен (например, Вы могли принять решение использовать единственный поток или пул потоков; это берет единицы кроме только миллисекунд).

ScheduledExecutorService executor =
    Executors.newSingleThreadScheduledExecutor();

Runnable periodicTask = new Runnable() {
    public void run() {
        // Invoke method(s) to do the work
        doPeriodicWork();
    }
};

executor.scheduleAtFixedRate(periodicTask, 0, 10, TimeUnit.SECONDS);
46
ответ дан 30 November 2019 в 15:28
поделиться

Взгляните на Таймер и классы TimerTask . Они точно, что Вы хотите.

можно сделать реализацию TimerTask, которая берет объект потока в конструкторе.

метод выполнения затем назовет потоки выполненным методом.

// Perhaps something like this
Timer t = new Timer();
t.scheduleAtFixedRate(yourTimerTask, 0, 10 * 1000);
// Hopefully your task takes less than 12 seconds
4
ответ дан 30 November 2019 в 15:28
поделиться

Одна опция состоит в том, чтобы создать ScheduledExecutorService, к которому можно затем запланировать задание:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.scheduleWithFixedDelay(...);

, Если Вы действительно решали иметь несколько потоков, затем можно создать ScheduledExecutorService с большим количеством потоков (снова через класс Исполнителей).

С точки зрения того, сколько потоков и что Вы вставляете каждый поток, с точки зрения производительности, я сказал бы, это зависит от:

  • для Вашего конкретного приложения, можно распараллелить действительно, "действительно работают", в то время как другой ожидает ввода-вывода?
  • был бы Ваши несколько потоков в конечном счете "перегружать тот же ресурс" (например, читайте из файлов в различных местоположениях на том же dsk), и таким образом замедлите друг друга, или они одновременно поразили бы различные ресурсы?
5
ответ дан 30 November 2019 в 15:28
поделиться
Другие вопросы по тегам:

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