2012-03-15 7 views
1

Я сделал несколько поисков здесь и не нашел ответа, поэтому я думаю, что лучше спросить. Я запускаю немного дорогой алгоритм в простом приложении Java swing. Позвольте мне описать структуру:Java Threads и высокое использование процессора

В моей JPanelrun() метод:

public void run() { 
    while(true) { 
     Algorithm alg = new Algorithm(signal); 
     new Thread(alg).start(); 

     //Wait for algorithm to finish 
     signal.await(alg); 

     updateInterface(); 

     Thread.sleep(60L); 
    } 
} 

алгоритм перебирает пикселей файла .JPG, то петли через другой большой массив Integer (длина ~ 12000), и возвращается. Нет очень дорогого калькулятора. Я вызываю Thread.sleep(60L) в алгоритме run() метод также.

Метод udpateInterface() очень быстрый, просто нарисуйте java.awt.Polygon объектов.

Несмотря на то, что я звоню Thread.sleep(60L), использование ЦП составляет около 160% на моей книге Mac (2.4 ГГц Intel Core 2 Duo, Mem 4GB 1067).

Есть ли способ, которым я могу запустить это без таяния моего компьютера? Я использую CountDownLatch как механизм уведомления ожидания.

Спасибо!

+0

'Thread.sleep' влияет на родительский поток (один с' while' показано), а не * новый * нить ('новый Thread') ... код может фактически быть нерест несколько потоков сразу, в зависимости от «сигнала» и всего. –

+0

Да, но поток алгоритмов также имеет вызов сна. – Fernando

+0

Я не понимаю, какова цель вызова 'sleep'. Если у вас есть работа, которую нужно сделать, почему вы спите? »Что вы имеете в виду« таяние моего компьютера ?! » Работа не может растопить ваш компьютер. Цель компьютера - выполнять работу. Если у вас есть полезная работа, сделайте это так.Для этого они нужны. –

ответ

4

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

private ScheduledExecutorService executorService = null; 

public void start() { 
    if (executorService != null && !executorService.isShutdown()) return; 

    executorService = Executors.newSingleThreadScheduledExecutor(); 
     executorService.scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       Algorithm alg = new Algorithm(signal); 
       alg.run(); 
       updateInterface(); 
      } 
     }, 0, 60, TimeUnit.MILLISECONDS); 
} 

public void stop() { 
    if (executorService != null) 
     executorService.shutdown(); 
} 
+0

Я постараюсь реализовать это, спасибо. – Fernando

2

160% Использование ЦП относительно одиночное Ядро вашей машины - то есть максимально возможное на вашей машине 200%, потому что оно имеет два ядра. Вы не плавите процессор.

+0

Спасибо за ваш комментарий. Иногда это очень близко к 200%, я не знаю, может ли это повредить компьютер ... – Fernando

+2

Нет. Это совершенно нормально - на самом деле 200% использования - это знак _good_, что ваше приложение эффективно распараллеливает работу. –

+0

@ LouisWasserman или эффективно тратить энергию ;-) Сохранение работы процессоров не совсем то же самое, что поддерживать их продуктивность ... В любом случае, я согласен с тем, что у процессоров есть что-то *, что не обязательно плохо. Однако остается вопрос: как заставить их «работать меньше» (занимать больше времени), решая это? –

1

Сколько вы хотите? Если вы хотите подождать 60 секунд, вы должны использовать 60000L, так как время указано в миллисекундах.

2

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

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

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

+0

Thread управляет алгоритмом и заканчивается. Я уже пытался работать в той же теме, и это увеличивает использование процессора. Синхронизация в порядке, мне нужно переконфигурировать это. Благодаря! – Fernando

Смежные вопросы