Java Event: медленная сеть - PullRequest
       4

Java Event: медленная сеть

0 голосов
/ 12 августа 2010

Я пытаюсь сделать немного асинхронного программирования, но мои навыки Java немного устарели ...

Вот мой код:

   private static String uname="xxx";
   private static String pword="xxx";
   private static int productId=82; 
   private static String sessionToken="";

    public static void main(String[] args)
        {
            BFGlobalService_Service service=new BFGlobalService_Service();
            BFGlobalService betfair=service.getBFGlobalService();

            System.out.println("hello");

            LoginReq loginReq=new LoginReq();
            loginReq.setUsername(uname);
            loginReq.setPassword(pword);
            loginReq.setProductId(productId);
            loginReq.setLocationId(0);
            loginReq.setVendorSoftwareId(0);

            LoginResp loginResp=new LoginResp();
            loginResp=betfair.login(loginReq);   //this line is very slow ;(
            sessionToken=loginResp.getHeader().getSessionToken();

            ...
        }

Строка "loginResp = betfair.login (loginReq)" занимает время (у меня очень медленная сеть 3G) и задерживает весь поток программы. Могу ли я поднять событие, когда это завершится?

т.е. Мне бы хотелось, чтобы этот вид псевдокода обработчика событий:

private void handleNewLoginResp(...)
{
   System.out.println("login response received");
   sessionToken=loginResp.getHeader().getSessionToken();
}

Я надеюсь, что это будет достаточно просто! Я пробовал гуглить, но все, что я могу найти, это статьи о графическом интерфейсе и т. Д. enter code here

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

Читать на Java Concurrency . Предполагая, что у вас есть пользовательский интерфейс, вы захотите использовать SwingWorker или любой другой функциональный эквивалент для вашей среды.

Обновление:

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

Это ничем не отличается от написания пользовательской обработки событий для графического интерфейса. (Вот почему вы ничего не находите при поиске.)

0 голосов
/ 12 августа 2010

Если нет доступной неблокирующей версии функции login(), вы должны запустить ее в отдельном потоке и запустить событие, когда это будет сделано.

Но будьте осторожны, работа с несколькими потоками означает, что вам нужно учитывать проблемы параллелизма. Вам нужно будет искать такие вещи, как безопасность потоков, ключевое слово java synchronized и Listeners.

(Слушатели (или слушатели событий) несущественны, но они представляют собой концепцию проектирования, которая необходима для создания хорошо спроектированного решения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...