Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контекст потока в Thread 
:(
    Опции темы
Stampede
Дата 1.12.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



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

Значится, так. Есть поток. В нем происходят всякие интересные штуки. В частности, происходят обращения к компонентам, реализации которых наперед неизвестны. Компоненты эти, в свою очередь, тоже не знают, откуда их позвали. А хотелось бы владеть такой инфой.

Разумеется, передать такую инфу можно миллионом разных способов, но тут есть одно но: любое из этих решений привносит зависимости и/или утяжеляет API. А хотелось бы, чтобы API был чистым и незамутненным. Короче, классическая задача для AOP. И тут я подумал...

... А что если приделать какой-нибудь контекст к самому треду? Тогда в него можно было бы совать всякую полезную инфу и по ходу добавлять разные смешные подробности! tux, see where I'm getting at?

Ну и вот я давай смотреть, нет ли чего похожего в Thread. На первый взгляд как будто нет. Но вот на второй... Если внимательно приглядеться, есть такой метод, setName(String name), и соответствующий геттер. А что такое, товарищи, String name? Да ведь это же бездонное вместилище какой угодно инфы!

Я, конечно, тут же сел и попробовал:

Код
package com.acme.test;

public class TestThreadSetName
{
    public static void m1()
    {
        System.out.println("Before:\t" + Thread.currentThread().getName());
        m2();
        System.out.println("After:\t" + Thread.currentThread().getName());
    }

    public static void m2()
    {
        Thread t = Thread.currentThread();
        t.setName(t.getName() + ";ctx=12345");
    }

    public static void main(String[] args)
    {
        m1();
    }

}


Выводит:

Код
Before:    main
After:     main;ctx=12345


Работает! Вы представляете, какая моща открывается перед нами?

Но не все так просто, на самом деле. Совсем просто было бы неинтересно smile

Дело в том, что метод может выкидывать исключение, по счастью нечекнутое:

Цитата
Throws:
    SecurityException - if the current thread cannot modify this thread.


Поэтому хотелось бы поговорить на такую тему: от чего это зависит и что и при каких условиях можно гарантировать.

Прошу высказываться, товарищи smile

Это сообщение отредактировал(а) Stampede - 1.12.2005, 19:44
PM WWW   Вверх
LSD
Дата 1.12.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Не знаю огорчу тебя или порадую, но есть такая штука java.lang.ThreadLocal которая позволяет организовать контекст потока намного легче:
Код
public class Context
{
  private static ThreadLocal<HashMap> context = new ThreadLocal<HashMap>();
  
  public static HashMap getContext()
  {
    HashMap hashMap = context.get();
    if(hashMap == null)
    {
      hashMap = new HashMap();
      context.set(hashMap);
    }
    return hashMap;
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 1.12.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



По поводу SecurityException, оно выбрасывается только если установлен SecurityManager. Для обычных приложений он как правило отсутствует, если только апплеты.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Stampede
Дата 1.12.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(LSD @ 1.12.2005, 21:45)
Не знаю огорчу тебя или порадую


Да уж конечно порадовал. Я ж не хакер какой, чтобы любить делать вещи через задний проход smile

Спасибо, вот чего не знал, того не знал. Кстати, если об этой штуке заранее не знаешь, то самостоятельно обнаружить ее существование не так-то просто. Если задать поиск, например, по java thread context, то все ссылки будут или про своп (аппаратного) контекста потока, или про контекстный загрузчик класса.

Так что еще раз спасибо, и получите плюсом в репу smile

PM WWW   Вверх
LSD
Дата 1.12.2005, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Stampede @ 1.12.2005, 22:27)
Кстати, если об этой штуке заранее не знаешь, то самостоятельно обнаружить ее существование не так-то просто.

Я нашел эту штуку когда читал про многопоточное программирование, правда по моему это была не Sun-овская дока. А еще есть хорошие утилитки для многопоточного программирования java.util.concurrent. Сам пользуюсь, очень удобно, но это правда в 1.5.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.