вівторок, 27 листопада 2007 р.
JSR 225 XQuery API for Java
Пример:
...
// establish a connection to the XQuery engine
XQConnection conn = xqds.getConnection();
// create an expression object that is later used
// to execute an XQuery expression
XQExpression expr = conn.createExpression();
// the XQuery expression to be executed
String es = "for $n in fn:doc('catalog.xml')//item " +
"return fn:data($n/name)";
// execute the XQuery expression
XQResultSequence result = expr.executeQuery(es);
// process the result (sequence) iteratively
while (result.next()) {
// retrieve the current item of the sequence as a String
String str = result.getAtomicValue();
System.out.println("Product name: " + str);
}
// free all resources allocated for the result
result.close();
// free all resources allocated for the expression
expr.close();
// free all resources allocated for the connection
conn.close();
...
субота, 24 листопада 2007 р.
JSR 166 Утилиты одновременного (конкурентного) доступа
Work-stealing:
У каждого рабочего(Worker) есть свой стэк (очередь работающая по принципу LIFO) задачь. Как только он выполняет все свои задачи то он пытается «украсть» задачу из стэка другого рабочего рассматривая его очередь — т.е. получая его задачи по принципу FIFO.
Позволяет работу которая может быть выполнена параллельно выполнять на разных ядрах процессора.
Большие (32 и более) ядерные процессоры выйдут во время использования Java 7, существование этого фреймворка позволит людям выполнять приложения для получения относительного простого увеличения производительности для вычислительных задачь. Сейчас forkjoin лучше всего работает на машинах Sun Niagaras и Azuls. Вообще то, вы не получите значительного ускорения с менее чем 4 процессорами из-за — основным назначением является компьютеры с наличием от десяти до сотни процессоров
Пример вычисления чисел Фибоначчи:
Без усовершенствований — обычный код:
int seqFib(int n) {
if (n <= 1)
return n;
else
return seqFib(n-1) + seqFib(n-2);
}
Усовершенствованный код:
class Fib extends FJTask {
static final int sequentialThreshold = 13; // for tuning
volatile int number; // argument/result
Fib(int n) { number = n; }
int getAnswer() {
if (!isDone())
throw new IllegalStateException("Not yet computed");
return number;
}
public void run() {
int n = number;
if (n <= sequentialThreshold) // base case
number = seqFib(n);
else {
Fib f1 = new Fib(n - 1); // create subtasks
Fib f2 = new Fib(n - 2);
coInvoke(f1, f2); // fork then join both
number = f1.number + f2.number; // combine results
}
}
public static void main(String[ ] args) { // sample driver
try {
int groupSize = 2; // 2 worker threads
int num = 35; // compute fib(35)
FJTaskRunnerGroup group = new FJTaskRunnerGroup(groupSize);
Fib f = new Fib(num);
group.invoke(f);
int result = f.getAnswer();
System.out.println("Answer: " + result);
}
catch (InterruptedException ex) {} // die
}
}
JSR 107 JCache API
Например, сервлет может создавать веб страничку из данных полученных из разных баз данных, сетевых соединений, и дорогих вычислений, наборы данных могут быть вторично использованы через некоторые одинаковые или разные промежутки времени.
середа, 14 листопада 2007 р.
JSR 310 API Даты и времени
Основные недостатки текущего АПИ это несколько их реализаций (util & sql для Date), ограничение на даты которые можно задать.
Этот JSR предлагает новое и улучшенное апи для даты и времени в Джава. Основная цель это разработка с учетом полученных уроков от первых двух АПИ (Дата и Календарь) в Джава, пердставляя более развитой и всесторонней модели для манипуляций с датой и временем.
Новое АПИ будет направлено на все приложения которым необходима модель данных для времени и даты. Эта модель заменит Date и Calendar, для включения представления даты без времени, времени без даты, продолжительностей и интервалов. Это увеличит качество кода. Например, вместо использования int для хранения продолжительности, и javadoc описания этого числа как количество дней, модель даты и времени предложит класс определяющий его однозначно.
АПИ будет основано на Joda-Time но будет обновлено с учетом JDK 5 фич и пользовательских добавлений.
вівторок, 13 листопада 2007 р.
JSR 275 Единицы измерений и Величины
Этот JSR специфицирует один или несколько Джава пакетов для программного управления физическими величинами и их выражением в единицах измерений. Спецификация включает:
Проверку совместимости измерений
Выражение величин в различных единицах измерений
Арифметический операции над измерениями
Классы реализующие стандартные типы измерений (такие как базовые, дополнительные и измеренные) и преобразование единиц измерений
Классы для парсинга единиц измерений из строк и для форматирования строковых представлений величин
набор предопределенных измерений
Пример
class Person {void setWeight(double weight);}
Непонятно в чем измеряется масса в килограммах или в фунтах
Исправляем
class Person { void setWeight(Measurableweight); }
Тут сложно ошибиться
Пример преобразования величин:
double distanceInMiles = 23.0;UnitConverter mileToKilometer = MILE.getConverterTo(KILO(METER));double distanceInKilometers = mileToKilometer.convert(distanceInMiles);
Пример с датой:
UnitHOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND); Measured = Measure.valueOf(12345, SECOND); System.out.println(d.to(HOUR_MINUTE_SECOND));>> 3h25min45s
субота, 10 листопада 2007 р.
JSR 203 NIO2
Предложенная спецификация продолжит работу определения набора новых улучшенных АПИ функций ввода/вывода которая началась в JSR-51: Новое АПИ ввода/вывода для платформы Джава. Его основные компоненты будут:
1.Новый интерфейс файловой системы который поддерживает полный доступ к атрибутам файла, уведомления об изменении, уход от АПИ зависящего от файловой системы и интерфейс для сервис-провайдера чтобы можно было подключать свои реализации файловых систем
2.АПИ для асинхронных (в противовес к постоянному опросу, не блокирующее) операций ввода/вывода на сокетах и файлах.
3.Завершение реализации функциональности сокетных каналов предложенных в JSR-51, включая добавление поддержки для биндинга, настроечных элементов конфигурации, и групповых сообщений.
Пример для ожидания изменения некоторого файла:
FileSystem fs = ...
FileReference file = ...
WatchService watcher = fs.newWatchService();
file.register(watcher, WatchEvent.MODIFY_EVENT);
for (;;) {
// Ожидать ключ изменения
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException ie) {
continue; // ignore
}
// получить события ключа
List
try {
events = key.takeEvents();
} catch (WatchEventLostException e) {
}
// Обработка события
for (WatchEvent event: events) {
if ((event & WatchEvent.MODIFY_EVENT) > 0) {
FileChannel fc = FileChannel.open(file, OpenFlag.READ);
FileLock lock = fc.lock();
...
lock.unlock();
fc.close();
}
}
// сброс для получения следующих событий
boolean cancelled = key.reset();
if (cancelled) {
break;
}
}
вівторок, 23 жовтня 2007 р.
Суперпакеты и Джава Модуль
JSR 294 Improved Modularity Support (superpackages)
Улучшенная поддержка модульности – суперпакеты
Позволяет объединять пакеты в суперпакеты и управлять доступом к ним (в основном для «скрытия деталей реализации»). Позволяет осуществлять доступ только к опубликованным API. Это предотвращает возможность потребителя зависеть от внутренних деталей и позволяет изменять некоторые аспекты реализации без затрагивания потребителей.
В Джаве есть механизмы для регулирования доступа – но они ориентированы на использование в рамках 1 пакета. Когда большой проект состоит из нескольких пакетов то регулировать доступ только для внешних систем или только остальных для внутренних пакетов невозможно.
Суперпакеты будут встроены как в компилятор (javac) так и в виртуальную машину Джава.
superpackage example.bar.lib {
// member packages
member package example.bar.lib;
// member superpackages
member superpackage example.bar.lib.net, example.bar.lib.xml;
// list of exported types
export example.bar.lib.Table;
export superpackage example.bar.lib.net;
}
JSR 277 Java Module System
Недостатки JAR:
Поддержка версий в JAR файлах служит для определения зависимостей от расширейний Джава (опциональных пакетов), но не версии самого Jar файла. Также нет надежного механизма для выражения, получения зависимостей одного JAR файла от другого. Ссылаясь на JAR файл, кроме всего прочего, необходимо указать его в classpath. Если путь к JAR файлу может изменится во время распространения конечному пользователю, разработчикам необходимо исправлять все эти ссылки для JAR файлов как части установочного процесса.
Разработчики также нашли что достаточно тяжело распространять Джава расширения из-за того что легко могут возникнуть проблемы с определением версий и коллизий области видимости (namespace). Джава расширения на данный момент могут устанавливатся только на указанную JRE; невозможно организовать так чтобы установленное расширение разделялось несколькими JRE.
Все эти недостатки призван исправить JAM.
Спецификация определяет формат распространения и репозиторий для коллекций Джава кода и соответствующих ресурсов. Также определяет механизмы нахождения, загрузки и интеграции во время выполнения. Определяет новый архив развертывания называемый JAM (Java Module). Java Module это JAR файл который содержит другие JARы, ресурсы и метаданные. JAM может специфицировать какие части модуля публичные (public) а какие скрытые (hidden). JAMы может специфицировать зависимости от других модулей.
Архитектура:
Формат распространения (Джава модуль) и его метаданные как единица доставки – для упаковки коллекций Джава классов и связанных ресурсов. Метаданные содержат информацию о модуле, классах и ресурсах которые находятся в модуле, и зависимости от других модулей. Метаданные также содержат список всех экспортируемых элементов для защиты классов и ресурсов от того чтобы они были использованы за пределами модуля не по назначению;
Схема версий которая определяет как модуль определяет как свою собственную версию так и версию зависимостей от других модулей;
Репозиторий для хранения, поиска и получения модулей с поддержкой версионности и изолированности.
Поддержка времени выполнения в загрузчике приложения и загрузчике классов поиска, загрузки и проверки целостности модулей.
Пример:
Запуск модулей используя Java launcher
//Запустить найстаршую версию com.wombat.webservice
java -module com.wombat.webservice
//Запустить com.wombat.webservice версии 1.2.0 или старше
Импортировать пользовательский модуль
java -module com.wombat.webservice:1.2.0+
ImportModule(com.sun.java2d, @VersionConstraint(”1.7.0”))
Пример модуля
@Version(“1.0”) // module annotation
super package com.wombat.webservice { // module name
// импорт модуля не ниже версии 1.0
@VersionConstraint(“1.0+”)
import org.foo.xml;
.....
}