Что Роллс-ройс путь состоит в том, чтобы развернуть апплет Java? [закрытый]

Предполагая, что ваша проблема - медленный внешний API, решением может быть использование либо многопоточного, либо асинхронного программирования. По умолчанию при выполнении ввода-вывода ваш код будет заблокирован. По сути, это означает, что если у вас есть метод, который выполняет HTTP-запрос для извлечения некоторого JSON, ваш метод сообщит вашей операционной системе, что вы собираетесь спать, и вы не хотите, чтобы его разбудили, пока операционная система не получит ответ на этот запрос. Поскольку это может занять несколько секунд, вашему приложению просто придется ждать.

Это поведение не относится только к HTTP-запросам. Чтение из файла или устройства, такого как веб-камера, имеет те же последствия. Программное обеспечение делает это, чтобы не перегружать процессор, когда он явно его не использует.

Итак, вопрос в вашем случае: нужно ли нам ждать завершения одного метода, прежде чем мы сможем вызвать другой? В случае, если поведение method_two зависит от результата method_one, тогда да. Но в вашем случае кажется, что это отдельные единицы работы без взаимозависимости. Таким образом, существует потенциал для выполнения параллелизма.

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

def main_method
  Thread.new { method_one }
  Thread.new { method_two }
  Thread.new { method_three }
end

def method_one
  # something_slow_that_does_an_http_request
end

def method_two
  # something_slow_that_does_an_http_request
end

def method_three
  # something_slow_that_does_an_http_request
end

Вызов main_method вызовет выполнение всех трех методов в том, что кажется параллельным. В действительности они все еще обрабатываются последовательно, но вместо того, чтобы переходить в спящий режим, когда блоки method_one блокируются, Ruby просто вернется в основной поток и переключится обратно в поток method_one, когда ОС подготовит входные данные.

Если предположить, что на выполнение каждого метода уходит две 2 мс минус ожидание ответа, это означает, что все три метода запускаются через 6 мс - практически мгновенно.

Если мы предположим, что для ответа требуется 500 мс, это означает, что вы можете сократить общее время выполнения с 2 + 500 + 2 + 500 + 2 + 500 до всего 2 + 2 + 2 + 500 - другими словами от 1506 мс до 506 мс.

Будет казаться, что методы работают одновременно, но на самом деле они просто спят одновременно.

В вашем случае, однако, у вас есть проблема, потому что у вас есть операция, которая зависит от завершения набора предыдущих операций. Другими словами, если у вас есть задачи A, B, C, D, E и F, то A, B, C, D и E могут выполняться одновременно, но F не может выполняться до A, B, C, D и E. все завершены.

1117 Существуют разные способы решения этой проблемы. Давайте посмотрим на простое решение, которое создает сонный цикл в главном потоке, который периодически проверяет список возвращаемых значений, чтобы убедиться, что какое-то условие выполнено.

def task_1
# Something slow
return results
end

def task_2
# Something slow
return results
end

def task_3
# Something slow
return results
end

my_responses = {}
Thread.new { my_responses[:result_1] = task_1 }
Thread.new { my_responses[:result_2] = task_2 }
Thread.new { my_responses[:result_3] = task_3 }

while (my_responses.count < 3) # Prevents the main thread from continuing until the three spawned threads are done and have dumped their results in the hash.
  sleep(0.1) # This will cause the main thread to sleep for 100 ms between each check. Without it, you will end up checking the response count thousands of times pr. second which is most likely unnecessary.
end

# Any code at this line will not execute until all three results are collected.

Имейте в виду, что многопоточное программирование - сложная тема с многочисленными подводными камнями. С MRI это не так уж и плохо, потому что хотя MRI успешно переключается между заблокированными потоками, MRI не поддерживает одновременное выполнение двух потоков, что решает довольно много проблем параллелизма.

Если вы хотите заняться многопоточным программированием, я рекомендую эту книгу: http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601

Он сосредоточен вокруг Явы, но объясненные ловушки и концепции универсальны.

15
задан 5 revs, 2 users 72% 23 May 2017 в 11:45
поделиться

7 ответов

См. Решение PulpCore (лицензия: BSD ).

Пример: игра Milpa ... сейчас , это развертывание апплета Rolls-Royce, если я когда-либо его видел.

И - абсолютно согласен, Sun's Deployment Toolkit крайне нуждается в обработке отключенной Java - в настоящее время он, похоже, полностью игнорирует это.

6
ответ дан 1 December 2019 в 02:55
поделиться

Для лучшей кроссбраузерности вам следует следовать советам SUn, особенно по использованию смешанных тегов встраивания / объекта. Это уродливо, но дает лучший охват.

1
ответ дан 1 December 2019 в 02:55
поделиться

Подумайте о наличии небольшого апплета на начальной странице, который сообщает браузеру перейти на настоящую страницу апплета.

На начальной странице также есть значок «Вы можете получить Java ] здесь "ссылка.

По моему опыту, неприятный javascript дает неприятную поддержку: (

Также обратите внимание, что Java 6 u 10 может использовать Java WebStart для развертывания апплетов. Это может быть более удобным для пользователя, если вы у пользователей установлена ​​эта версия или более поздняя.

1
ответ дан 1 December 2019 в 02:55
поделиться

I find JavaScript to be the best solution. For IE, write an object tag and control the exact minimum version of the JRE through the classid attribute, for everything else an embed tag with type="application/x-java-applet;version=1.5" works just fine. Both use the built-in browser mechanisms for coping with an out of date (or complete lack of) java.

You can also do fancy things like specify 1.5.0 as the minimum version, but set the auto-download to 1.6 so anyone without java gets the latest JRE instead of 1.5.

The project I work on has rolled our own cross-platform JS wrapper for many years, but with Java 6 update 10 Sun created deployJava.js which aims to solve all of these problems for you.

3
ответ дан 1 December 2019 в 02:55
поделиться

После долгой борьбы со старой и устаревшей информацией по всему Интернету кажется, что на самом деле есть действительно простой способ развертывания апплетов - просто позвольте Sun написать за вас правильные теги!

<script src="http://java.com/js/deployJava.js"></script>
<script>
  var attributes = {
    code:'java2d.Java2DemoApplet.class',
    archive:'Java2Demo.jar',
    width:710, 
    height:540
  };
  var parameters = {
    fontSize:16
  };
  var version = '1.6' ; // whichever minimum version you want to target, null works also
  deployJava.runApplet(attributes, parameters, version);
</script>

Работал как очарование, кроссбраузерность, для меня, с автоматическим перенаправлением на страницу загрузки, если java не установлена.

Подробнее здесь:

http://java.sun.com/javase/6/docs/technotes/guides /jweb/deployment_advice.html#deplToolkit

8
ответ дан 1 December 2019 в 02:55
поделиться

Привет, просто используйте тег объекта. Это часть спецификации HTML и работает с большинством браузеров.

Резервный вариант установки - это просто написание текста в теге.

Вот полезная статья на эту тему:

http://depth-first.com/articles/2008/02/20/demystifying-java-applets-part-1-cross-browser-standards-compliant -pure-html-deployment-using-the-object-tag

С уважением

1
ответ дан 1 December 2019 в 02:55
поделиться

Ну, имейте в виду, что deployJava.js предназначен для вызова во время загрузки документа. Так что если вы вставляете апплет динамически, по событию, после построения DOM, то вам не повезло с этим новым стандартным подходом. Пришлось использовать конструкцию object/embed/noembed.

Edit: О, кто-то нашел лучший способ для этого, но это потребовало ручного изменения оригинального deployJava.js от SUN, пожалуйста, смотрите ссылку ниже: Java Plug-In - Важное дополнение к deployJava.js

1
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

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