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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> что это за конструкция? 
V
    Опции темы
Корнелиус
Дата 9.2.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 14.12.2005

Репутация: нет
Всего: 1



Что это за конструкция?
Код

new Thread() {
public void run() {
o.one();
}
}.start();


Непонятно... вроде, создает... и описывает в то же время
PM MAIL   Вверх
aefimov
Дата 9.2.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 26.1.2006

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



Обычный аннонимный inner class.
И это не правильная конструкция. Совсем правильная вот такая:
Код

new Thread(
    new Runnable() {
        public void run() {
             o.one();
        }
    }
).start();

Методы самого треда лучше не перегружать.
PM MAIL   Вверх
LSD
Дата 9.2.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Эта конструкция создает анонимный класс унаследованный от Thread
Код
new Thread() {    
...
}


Здесь переопределяется метод run() класса Thread.
Код
public void run() {    
  o.one();    
}


Здесь у вновь созданного объекта вызывается метод start()
Код
.start();


P.S. Лучше такой код не писать.


--------------------
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   Вверх
Beard
Дата 9.2.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 9



Анонимный класс.
по сути это
class MyThread extends Thread {
public void run() {
o.one();
}
}

...
new MyThread().start()
PM MAIL   Вверх
Корнелиус
Дата 9.2.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 14.12.2005

Репутация: нет
Всего: 1



Забавно, это пример из туториала )

Код

public class ThreadTest {
private int a=1, b=2;
public void one() {
a=b;
}
public void two() {
b=a;
}
public static void main(String s[]) {
int a11=0, a22=0, a12=0;
for (int i=0; i<1000; i++) {
final ThreadTest o = new ThreadTest();
// Запускаем первый поток, который
// вызывает один метод
new Thread() {
public void run() {
o.one();
}
}.start();
// Запускаем второй поток, который
// вызывает второй метод
new Thread() {
public void run() {
o.two();
}
}.start();
// даем время отработать потокам
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
// анализируем финальные значения
if (o.a==1 && o.b==1) a11++;
if (o.a==2 && o.b==2) a22++;
if (o.a!=o.b) a12++;
}
System.out.println(a11+" "+a22+" "+a12);
}
}


Объясните, плз, что значит "даем время отработать потокам"? sleep их разве не приостанавливает просто? Или, пока один стоит, другой работает, а потом они меняются?
PM MAIL   Вверх
batigoal
Дата 9.2.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Цитата(Корнелиус @ 9.2.2006, 16:04 Найти цитируемый пост)

Объясните, плз, что значит "даем время отработать потокам"?

Просто освобождаем ресурсы для других потоков. Так мы не завесим все нафиг своими циклами.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 9.2.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Корнелиус @ 9.2.2006, 15:04 Найти цитируемый пост)
Объясните, плз, что значит "даем время отработать потокам"? sleep их разве не приостанавливает просто? Или, пока один стоит, другой работает, а потом они меняются?

Thread.sleep(); приостанавливает только текущий поток. Остальные в это время будут выполняться как обычно.


--------------------
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   Вверх
Корнелиус
Дата 9.2.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 14.12.2005

Репутация: нет
Всего: 1



То есть, я так понимаю, один поток спит - второй работает. Но потом же они должны местами поменяться. А sleep один раз только вызывается. И то не очень понятно у кого именно:

Код

try {
Thread.sleep(100);
} catch (InterruptedException e) {}

PM MAIL   Вверх
LSD
Дата 9.2.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Корнелиус @ 9.2.2006, 15:23 Найти цитируемый пост)
То есть, я так понимаю, один поток спит - второй работает.

Нет, потоки работают одновременно. Вернее одновременно они работают на многопроцессорной системе, а на однопроцессорной просто постоянно происходит переключение между ними. Для программиста все выглядит так, как будто потоки работают одновременно.

Цитата(Корнелиус @ 9.2.2006, 15:23 Найти цитируемый пост)
А sleep один раз только вызывается. И то не очень понятно у кого именно:

Он вызывается для текущего потока, т.е. в твоем случае это main - основной поток выполнения программы, его создает JVM при запуске приложения.


--------------------
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   Вверх
Корнелиус
Дата 9.2.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 14.12.2005

Репутация: нет
Всего: 1



Цитата(LSD @ 9.2.2006, 15:46)
Он вызывается для текущего потока, т.е. в твоем случае это main - основной поток выполнения программы, его создает JVM при запуске приложения.


Подзапутался я... А как же эти два: "
// Запускаем первый поток, который
// вызывает один метод
....
// Запускаем второй поток, который
// вызывает второй метод
..."

Это что не потоки? Зачем их создавать, а sleep() у main звать? Или они - подпотоки? Если можно, подробнее
PM MAIL   Вверх
LSD
Дата 9.2.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Корнелиус @ 9.2.2006, 16:08 Найти цитируемый пост)
Это что не потоки? Зачем их создавать, а sleep() у main звать? Или они - подпотоки? Если можно, подробнее

Это тоже потоки. Там просто создается еще два потока и запускаются. После этого в твоей программе будет 3 потока (вернее их будет больше, но остальные служебные и тебе без надобности). Когда поток создан и запущен, он становится полностью самостоятельным, можешь считать что он получил в свое распоряжение отдельный процессор и выполняется на нем.
А sleep() вызывается затем, чтобы на время приостановить поток main, и пока он будет стоять два созданнхы ранее потока успели отработать (они то работают независимо от main-а). Пока поток main спит они успевают вызвать методы one() и two(). Поток main не обязан ждать пока отработают два других потока, но ему нужны результаты их работы, поэтому он ждет.


--------------------
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   Вверх
Корнелиус
Дата 9.2.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 14.12.2005

Репутация: нет
Всего: 1



О! Наконец то я въехал. Большое спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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