Java: многопоточность, работа с XML
Параллельное выполнение задач Процессы – параллельное выполнение в различном адресном пространстве. Взаимодействие через средства InterProcess Communication (IPC): sockets, pipes, shared memory. Потоки – параллельное выполнение в едином адресном пространстве. Проблемы – синхронизация при доступе к общим данным, блокировки.
Потоки Java: java.lang.Thread Создание потока: public static void main( String []args ){ class MyThread extends Thread{ public void run(){ for( int i = 0; i < NNN; i++ ){ … } } t.start(); System.out.println( Waiting for the thread… ); t.join(); }
Потоки Java: java.lang.Thread Создание потока: public static void main( String []args ){ Thread t = new Thread(){ public void run(){ /* long operation */ } }.start(); //Waiting… t.join(); }
Потоки Java: java.lang.Thread Создание потока на основе интерфейса Runnable: class MyRunnable implements Runnable{ public void run(){ … } } new Thread( new MyRunnable() ).start();
Работа с XML-документами Пакет javax.xml Библиотека dom4j/jaxen ( Библиотека Apache Xerces for Java ( Библиотека JDom (
dom4j Подключение библиотек в NetBeans:
dom4j - пример ]]>. Simple text nodes not allows
Dom4j - пример import org.dom4j.Document; import org.dom4j.io.SAXReader; import java.io.InputStreamReader; import java.io.FileInputStream; public class TestDom4j{ public static void main( String []args ){ try{ SAXReader reader = new SAXReader(); Document doc = reader.read( new InputStreamReader( new FileInputStream(in.xml) ) ); System.out.println( NewsFeed/Item/title: + doc.getRootElement().element(Item).element(title).getText() ); }catch( Exception exc ){ exc.printStackTrace(); }
Выражения XPath Выбор всех узлов Item: /NewsFeed/Item или //Item Выбор элемента title для Item с порядковым номером 10: /NewsFeed/Item[position() = 10]/title или /NewsFeed/Item[10]/title Поиск по значению атрибута (Item с атрибутом id=112233): = ] Поиск Item, для которых изображение имеет расширение png: //Item[ ] Поиск Item, для которых в элементе desc присутствует фраза Simple text: //Item[ contains(desc/text(), Simple text) ]
XPath в Dom4j import …; public class TestXPath{ public static void main( String []args ){ try{ Document doc = new SAXReader().read( new InputStreamReader( new FileInputStream( in.xml ) ); //Выбор первого элемента Item Element firstItem = (Element)doc.selectSingleNode( /NewsFeed/Item[1] ); //Количество элементов Item System.out.println( Item count: + doc.valueOf( count(//Item) ) ); //Выбор всех элементов Item List items = doc.selectNodes( /NewsFeed/Item ); for( Node item : items ){ //Доступ к атрибуту System.out.println( + ); //Доступ к атрибуту System.out.println( Item/image: + ); //Приведение типа и использование методов класса org.dom4j.Element Element itemElement = (Element)item; itemElement.addAttribute( temporaryAttribute, +rnd.nextInt(32767) ); System.out.println( itemElement.attributeValue( temporaryAttribute ) ); System.out.println( ) ); } }catch( Exception exc ){ … } }
Дополнительные сведения Получение части XML-документа: Document doc = … doc.selectSingleNode( /NewsFeed/item[1] ).asXML(); Запись XML-документа: OutputFormat fmt = OutputFormat.createPrettyPrint(); FileOutputStream outStream = new FileOutputStream( out.xml ); XMLWriter wr = new XMLWriter( outStream, fmt ); wr.write( doc ); wr.close();
Задание 1 Разработать программу, которая позволяла бы выполнение запросов XPath для загруженного XML-документа. Документ должен быть загружен при запуске программы.
XPath – выбор части элементов Выбор части элементов Item doc.selectNodes( /NewsFeed/Item[ position() >= 0 and position() < 10] ); Выбор всех атрибутов и элементов: doc.selectNodes( //* | ); Полный список функций XPath (position(), contains(), substring() и др.) :
Задание 2 Исходный файл ex-xml.xml содержит элементов Item. Разработать консольную программу для выбора всех элементов Item из XML-файла, которые содержат элемент desc с искомым текстом (задается, как переменная в main). В методе main() должна быть объявлена константа THREADS_COUNT – ограничение на количество строк, читаемых каждым потоком из исходного файла. Реализовать поиск элементов одним XPath-запросом и запросом, выполняемым параллельно в THREADS_COUNT потоках. Оценить время выполнения единого и множества параллельных запросов.