2011-01-15 5 views
0

Я только что создал программу с Eclipse, которая занимает очень много времени. Это займет еще больше времени, потому что загрузка моего процессора до 25% (я предполагаю, что это потому, что я использую четырехъядерный процессор, а программа использует только одно ядро). Есть ли способ заставить программу использовать все 4 ядра, чтобы максимизировать ее? Предполагается, что Java должен быть многопоточным, поэтому я не понимаю, почему он будет использовать только 25%.Ручное увеличение количества процессора, используемого Java-приложением

+0

Это зависит от того, как это запрограммировано: действительно ли вы используете несколько потоков? – lweller

+0

Не видя своего кода, сложно сделать предложения.Вы используете потоки только сейчас? Где данные, поступающие и идущие (т. Е. Существуют ли другие узкие места в программе)? –

+1

Посмотрите классы Thread, Executors и Runnable. Это может помочь вам в пути. – extraneon

ответ

1

Java многопоточен, но если ваше приложение работает только в одном потоке, будет использоваться только один поток. (Помимо внутренних потоков, которые Java использует для финализации, сбора мусора и т. Д.)

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

3

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

+0

Как мне это сделать? Я еще не углубился в Java. – SkylineAddict

2

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

Еще одна важная деталь, которую следует отметить, заключается в том, что потоки Java не совпадают с потоками системы. JVM часто имеет свой собственный планировщик потоков, который пытается помещать потоки Java в фактические потоки системы таким образом, что это справедливо, но нет никакой реальной гарантии, что он это сделает.

2

Да, Java многопоточно, но многопоточность не происходит «по волшебству».

Посмотрите на класс Thread или на инфраструктуру Executor. По существу, вы должны разделить свою работу на «подзадачи», каждый из которых может работать на одном процессоре, то сделать что-то вроде этого:

Executor ex = Executors.newFixedThreadPool(4); 
while (thereAreMoreSubtasksToDo) { 
    ex.execute(new Runnable() { 
    public void run() { 
     ... do subtask ... 
    } 
    }); 
} 

Включение последовательного рутинную/алгоритма в параллельный не тривиальна: вам нужно знать, в частности, целый ряд вопросов, которые в целом называются «безопасность потоков». Вам может быть интересен какой-то материал, который я написал о thread-safety in Java, и нарезка в целом, если вы следуете ссылкам: главное, чтобы иметь в виду, что если какие-либо данные/объекты распределяются между разными потоками, то вам нужно принять особые меры предосторожности. Тем не менее, для независимых вещей, которые вы просто хотите «запустить в одно и то же время», тогда приведенный выше шаблон поможет вам начать работу.

0

У вас есть немного знаний перед вами (на самом деле, довольно много обучения), но вы учитесь, что должны делать, если будете делать серьезные программы.

Вот отправная точка: http://download.oracle.com/javase/tutorial/essential/concurrency/

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

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