понедельник, 23 мая 2011 г.

Многопоточность в java. Пример

Удобство
Да, многопоточность в яве действительно сделана хорошо. Инструменты удобны и если хочется получить какой-то высокоуровневый инструмент для многопоточной программы, то он существует (а если нет, то один из существующих наверняка лучше того, который хотелось увидеть).
Простой пример:
private static String[] sites = 
    {"www.google.com", "www.ya.ru", "www.yahoo.com"};
//создание пула потоков    
ExecutorService service = Executors.newCachedThreadPool();
List<Future<String>> futures = 
    new ArrayList<Future<String>>();
for (int i = 0; i < sites.length; ++i) {
    //запуск нового потока с параметром из массива
    Future<String> future = 
        service.submit(new ThreadWorker(sites[i]));
    futures.add(future);
    }
//на этом этапе все потоки запущены
System.out.println("threads started");
for (Future<String> future : futures) {
    //забираем результат выполнения потока
    //если поток ещё не завершился, то происходит ожидание
    System.out.println("get result from Future: " + future.get());
}
//сообщаем пулу о том, что закончили пользоваться потоками
service.shutdown();
Подробнее?

пятница, 20 мая 2011 г.

Форматированный вывод вещественных чисел

Постоянно если сталкиваюсь, то пытаюсь вспомнить, что ж там надо писать в строке формата String.format, чтобы вывести в том виде, в котором нужно. И постоянно приходится или угадывать, или гуглить. Даже не знаю, что быстрее. Поэтому стоит записать, как же получить нормальное строковое представление для float/double немного альтернативным способом:
NumberFormat format = new DecimalFormat("#.##", 
    new DecimalFormatSymbols(Locale.US));
String result = format.format(doubleParam);

Второй параметр у конструктора можно не указывать. По умолчанию используется локаль системы. Мне было неудобно, т.к. нужна была точка в качестве разделителя целой и дробной части, а русская локаль ставит запятую.
Как это сработает?
1.4 "1.4"
1.333"1.33"
1.89999"1.9"
16.23"16.23"

Тесты

Нет, заметка не о jUnit, хоть я и люблю их.
Хотел поделиться новостью: http://www.quizful.net снова работает.
Кстати, на прошлую заметку меня натолкнул тест именно на этом ресурсе

Численные методы на службе прикладного программиста

Точность чисел
На определённые исследования по этой теме меня сподвиг вопрос теста:
long l1 = Long.MAX_VALUE;
long l2 = Long.MAX_VALUE-1;
double d1 = Long.MAX_VALUE;
System.out.println("l1 == d1: " + (l1 == d1));
System.out.println("l2 == d1: " + (l2 == d1));
Чтобы никто не мучился, сразу скажу, вывод даст:
l1 == d1: true
l2 == d1: true

Почему?