Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Ленивая загрузка
#11
Не выдержал, заоффтопил
Родился, живу и когда-нибудь умру.
Ответ
#12
Pointer*Rage Написал:
Код:
    @Override
    public void reload() {
        Future<?> future1 = ThreadPoolManager.getInstance().executeGeneral(() -> despawn(XSpawnCache.getInstance().getSpawn(day)));
        Future<?> future2 = ThreadPoolManager.getInstance().executeGeneral(() -> despawn(XSpawnCache.getInstance().getSpawn(night)));
        try {
            future1.get();
            future2.get();
        } catch(ExecutionException e) {
            log.error("Failed to reload event rotator", e);
        } catch(InterruptedException e) {
            Thread.currentThread().interrupt();
            return;
        }
        
        ...
    }
future1 & future2 - асинхронные задачи, которые будут выполняться в любом свободном потоке из пула.
Если в этих тасках будет работа с блокирующим апи(запрос к бд, например), выходит, что метод reload() блокирует сразу 3 потока?

future1.get() - ожидание выполнения задачи, первый заблокированный поток
future1 & future2 - второй и третий заблокированные потоки, если будет работа с блокирующим апи.

Поправьте, если я не прав.
Ответ
#13
А разве обычный ThreadPoolManager не выполнит задачу в отдельном потоке?

Достаточно было бы запускать:

Код:
ThreadPoolManager.getInstance().scheduleGeneral(new TheClass(), 1);

В момент "полной" загрузки сервера

Код:
public class TheClass implements Runnable
{
    @Override
    public void run()
    {
        try{
            Connection con = null;
            try
            {
                con = L2DatabaseFactory.getInstance().getConnection();
                PreparedStatement stm = con.prepareStatement("SELECT * FROM special_bosses");
                ResultSet rs = stm.executeQuery();

                while(rs.next())
                {
                    // загрузка, спавн и тд
                                // время загрузки 1 босса ~ 0.5сек
                }
            }
        }
        catch(Throwable t){
            t.printStackTrace();
        }
    }
}

правда как определить момент загрузки сервера хз..
Ответ
#14
iRevive Написал:future1 & future2 - асинхронные задачи, которые будут выполняться в любом свободном потоке из пула.
Если в этих тасках будет работа с блокирующим апи(запрос к бд, например), выходит, что метод reload() блокирует сразу 3 потока?

future1.get() - ожидание выполнения задачи, первый заблокированный поток
future1 & future2 - второй и третий заблокированные потоки, если будет работа с блокирующим апи.

Поправьте, если я не прав.

Все верно, но блокировка происходит вызывающего потока.
future1.get - первый заблокированный поток, который и вызывает этот самый гет; блокируется до момента окончания работы future1.
future2.get - тоже самое, тот же самый поток, только блокируется до окончания работы future2.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Загрузка оперативы Landver 13 2,570 05-15-2013, 01:24 PM
Последний пост: Landver
  Загрузка процессора процессом java.exe vokforever 22 5,978 08-07-2012, 04:07 PM
Последний пост: don.kein
  Ошибка ГС[загрузка конфига] Effas 4 2,255 11-04-2011, 12:20 AM
Последний пост: Effas
  Загрузка скриптов Megapolis 7 2,703 10-02-2011, 11:29 PM
Последний пост: KilRoy
  Загрузка одного ядра rromank 5 2,426 01-15-2011, 11:04 AM
Последний пост: weTr1k
  загрузка с ошибкой в GameServer niko42 3 3,217 11-10-2010, 01:26 PM
Последний пост: incognito
  Emu rev. 900 Загрузка ЦП Samurai 4 2,772 12-22-2008, 07:41 AM
Последний пост: Samurai

Перейти к форуму:


Пользователи, просматривающие эту тему: 4 Гость(ей)