Метод join join () java [duplicate]

Вы можете сделать это с помощью памяти кучи (через вызов malloc () ), как и другие ответы, описанные здесь, но вы всегда должны управлять памятью (используйте функцию free () каждый раз, когда вы вызываете свою функцию). Вы также можете сделать это со статическим массивом:

char* returnArrayPointer() 
{
static char array[SIZE];

// do something in your array here

return array; 
}

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

int main() 
{
char* myArray = returnArrayPointer();
/* use your array here */
/* don't worry to free memory here */
}

В этом примере вы должны использовать статическое ключевое слово в определение массива, чтобы установить продолжительность жизни массива в приложении, поэтому он не будет уничтожен после оператора return. Разумеется, таким образом вы занимаете байты SIZE в своей памяти на весь срок службы приложения, поэтому его размер будет правильным!

1
задан Justin Self 16 November 2011 в 01:20
поделиться

2 ответа

Вы блокируете поток пользовательского интерфейса. Вы не должны этого делать. Опции:

  • У вас есть другой поток , который просто вызывает join в первых трех. Полезно с точки зрения создания другого ресурса, но достаточно простого.
  • Используйте счетчик - убедитесь, что вы используете что-то вроде AtomicInteger, чтобы убедиться, что вы не запускаете модель памяти и проблемы с условиями гонки. Запустите счетчик на 3 и уменьшите его в конце каждого потока. Когда последний поток завершит свою работу (т. Е. Его декремент ставит счетчик на 0), сделайте , чтобы он перешел в пользовательский интерфейс.

(Вторая пуля может быть тем, что вы делали уже ... Трудно сказать наверняка, учитывая описание просто «Я использовал счетчик».)

Пока Я полностью понимаю, откуда вы пришли с точки зрения потока управления приложения, который намного сложнее в мире, управляемом событиями, так как работает Swing (и так работает большинство других интерфейсов пользовательского интерфейса). Вы просто не можете блокировать поток пользовательского интерфейса. (Это также почему C # 5 делает все проще на уровне language ...)

1
ответ дан Jon Skeet 19 August 2018 в 03:16
поделиться
  • 1
    Я использовал счетчик, чтобы отслеживать, сколько из потоков было выполнено. Когда все потоки выполняются, я затем делаю что-то (). Но я хочу следующую строку после thread1.start (); thread2.start () doSomething (). Но прогресс все замораживается. – Lews Therin 16 November 2011 в 01:27
  • 2
    @LewsTherin: вам нужно будет использовать SwingUtilities.invokeLater из того, что последний раз заканчивается, чтобы вызвать doSomething. В принципе, вы не можете делать что-то долгое время в потоке пользовательского интерфейса. – Jon Skeet 16 November 2011 в 01:45
  • 3
    Я попробую это спасибо. – Lews Therin 16 November 2011 в 01:57

Выполнение любой операции блокировки в событии Dispatch Thread приведет к тому, что ваш GUI перестанет реагировать и перестанет перекрашиваться. Вот почему длительные операции должны выполняться в фоновом потоке.

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

Уже предоставленный механизм обратного вызова, доступный в Java 6+, - SwingWorker , Внесите работника, поместив join() s (и start() s) в метод doInBackground(). Затем любые операции Swing, которые вы хотите сделать после, могут войти в done().

3
ответ дан Mark Peters 19 August 2018 в 03:16
поделиться
  • 1
    Можете ли вы объяснить, что вы имеете в виду? Я понятия не имею, что вы подразумеваете, блокируя поток пользовательского интерфейса. Я только начал изучать темы. – Lews Therin 16 November 2011 в 01:25
  • 2
    Поток UI (или EDT) - это поток, который отвечает за обработку событий пользовательского интерфейса (например, щелчков мыши) и перерисовку экрана. Блокирование потока пользовательского интерфейса просто означает, что он должен делать то, что занимает много времени. Например, join() заставляет поток ждать до тех пор, пока "объединенный" нить заканчивается ..., что может занять относительно много времени. Ущерб в блокировке заключается в том, что в течение этого времени не обрабатываются другие события пользовательского интерфейса; то есть пользовательский интерфейс становится невосприимчивым. (Длительность «длительное время» является субъективной, но вы узнаете ее, когда увидите ее.) – Stephen C 16 November 2011 в 02:27
Другие вопросы по тегам:

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