Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > что это за конструкция?


Автор: Корнелиус 9.2.2006, 14:49
Что это за конструкция?
Код

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


Непонятно... вроде, создает... и описывает в то же время

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

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

Методы самого треда лучше не перегружать.

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


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


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


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

Автор: Beard 9.2.2006, 14:55
Анонимный класс.
по сути это
class MyThread extends Thread {
public void run() {
o.one();
}
}

...
new MyThread().start()

Автор: Корнелиус 9.2.2006, 15:04
Забавно, это пример из туториала )

Код

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 их разве не приостанавливает просто? Или, пока один стоит, другой работает, а потом они меняются?

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

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

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

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

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

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

Код

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

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

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

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

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

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


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

Это что не потоки? Зачем их создавать, а sleep() у main звать? Или они - подпотоки? Если можно, подробнее

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

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

Автор: Корнелиус 9.2.2006, 16:33
О! Наконец то я въехал. Большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)