вівторок, 27 листопада 2007 р.

JSR 225 XQuery API for Java

Этот JSR определяет АПИ для выполнения Xquery вызовов и для работы с результатами. XQJ представляет для Xquery тоже что и JDBC для SQL. АПИ XQJ имеет много общего с высокоуровневыми концепциями JDBC ( DataSource, Connection и др.) но также поддерживает специфические концепции Xquery — такие как статические и динамические фазы, XML-ориентированное получение данных и др.
Пример:
...
// 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 Утилиты одновременного (конкурентного) доступа

Этот JSR первоначально был представлен для библиотек обеспечивающих конкурентный доступ в Джава 5 и также привел к изменениям в Джава 6. Для Джава 7, группа JSR 166 добавит новый вид BlockingQueue называемый TransferQueue и фреймворк для параллельных вычислений основанный на таких принципах: разделяй и властвуй(divide-and-conquer) и украдающий работу (work-stealing).
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

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

середу, 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(Measurable weight); }

Тут сложно ошибиться


Пример преобразования величин:

double distanceInMiles = 23.0; UnitConverter mileToKilometer = MILE.getConverterTo(KILO(METER)); double distanceInKilometers = mileToKilometer.convert(distanceInMiles);

Пример с датой:


Unit HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND);
Measure d = Measure.valueOf(12345, SECOND);
System.out.println(d.to(HOUR_MINUTE_SECOND));
>> 3h25min45s


суботу, 10 листопада 2007 р.

JSR 203 NIO2

API для доступа к файловой системе, асинхронных масштабируемых операций ввода-вывода, биндинга сокет-каналов и конфигурации, и групповые сообщения.
Предложенная спецификация продолжит работу определения набора новых улучшенных АПИ функций ввода/вывода которая началась в 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 events;
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;
}
}