На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Groovy

Пару недель назад вернулся к экспериментам с Groovy. И чем дальше -- тем больше он мне нравится. В том числе -- достаточно развитыми воззможностями по созданию своих языковых конструкций.

Пример: достаточно часто в адгоритме видны несколько параллельных невзаимодействующих веток. В Occam, к примеру, это описывается конструкцией PAR.

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

Прелесть Groovy в том, что обвязку легко спрятать. Пример готовой программы:

 1 package sample.parallel
2
3 class ParallelExecutionApp {
4
5 static void main (String[] args) {
6
7 println "Started"
8
9 def values = ParallelExecution.parallel(
10 foo: {
11 someProcess("Foo")
12 },
13 bar: {
14 someProcess("Bar")
15 },
16 buzz: {
17 def items = []
18 items << someProcess("Buzz1", 2)
19 items << someProcess("Buzz2", 2)
20 items << someProcess("Buzz3", 2)
21 items << someProcess("Buzz4", 2)
22 items.join(':')
23 }
24 )
25
26 println "${values.foo}, ${values.bar}, ${values.buzz}"
27
28 }
29
30 static String someProcess (String text, def maxTime = 10) {
31 def rnd = new Random()
32 def time = rnd.nextInt(maxTime)
33 println "Time for ${text}: ${time} sec"
34 Thread.sleep(time * 1000L)
35 println "Completed: ${text}"
36 return text
37 }
38
39 }

Здесь мы параллельно вычисляет три значения и, когда все три будут готовы, выводим их. Реализуется до смешного просто:

 1 package sample.parallel
2
3 import java.util.concurrent.Callable
4 import java.util.concurrent.FutureTask
5 import java.util.concurrent.ExecutorService
6 import java.util.concurrent.Executors
7
8 class ParallelExecution {
9
10 static Map parallel (Map tasks) {
11 def executor = Executors.newFixedThreadPool(tasks.size())
12 try {
13 def futureTasks = [:]
14 tasks.each { key, script ->
15 executor.execute(futureTasks[key] = new FutureTask(script as Callable))
16 }
17 def results = [:]
18 futureTasks.each { key, task -> results[key] = task.get() }
19 return results
20 } finally {
21 executor.shutdownNow()
22 }
23 }
24
25 }
наверх