быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
1

Как в классе Thread реализован вызов run(), если метод run() определён в АВТОРСКОМ классе?

03.01.2014, 22:42. Показов 2983. Ответов 16
Метки нет (Все метки)

И, следовательно, в классе Thread ничего не известно о вызове run?

То есть, ребята, мне пришла в голову мысль. Коль скоро самый простой способ создать поток, вот он:

Java
1
2
3
4
5
6
7
8
class NewThread implements Runnable {
  Thread t;
  NewThread() {
    t = new Thread(this);
    t.start();
  }
  public void run() {}
}
Так, а потом в методе main пишем new NewThread(); и всё, поток создан. Я тут подумал, что функция Thread.start реализована так, что внутри себя вызывает run (а как иначе?) И захотелось мне написать свой класс Thread_ с функцией start, вызывающей run, поехали:

Java
1
2
3
class Thread_ {
  void start () {run();}
}
Всё, дальше я гадать не стал. И так понятно, что функция run имеет отношение к классу Thread_, как свинья к апельсинам и компилятор на этот код ругнётся. Но как же тогда реализован класс Thread, что- повторю- в его методе start вызывается функция run, которая определена много позже, а именно в авторском класссе (NewThread в данном случае)

Если слишком замудрёно, на уровне асма, многопоточность всё-таки, то не пишите. А если решение на поверхности, тогда был бы рад услышать ответ. Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2014, 22:42
Ответы с готовыми решениями:

Почему если в классе реализован метод __eq__, то объекты класса становятся некэшируемыми?
То есть к ним нельзя применить функцию hash ()? ++++++++++++++++++++++++++++++++++++ ...

Как реализован метод DrawLine и другие, описанные в классе Graphics
На msdn не удосужились описать способ работы методов, там всего-лишь приведён пример...

Как создать метод с использованием объекта другого метода, который определен в другом классе
В общем суть вот в чем: У меня есть 2 класса. 1 основный(Program) в нем в методе Main создается...

Ошибка:метод расширения должен быть определен в статическом классе
Можете найти ошибку ? метод расширения должен быть определен в статическом классе скорее всего...

16
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
04.01.2014, 00:05 2
Цитата Сообщение от kravam Посмотреть сообщение
Java
1
2
3
class Thread_ {
* void start () {run();}
}
Ругается потому, что вы вызываете метод run, хотя он нигде в этом классе не объявлен. Если хотите вызывать у родителя, то этот класс должен наследоваться от класса java.lang.Thread
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
04.01.2014, 00:05 3
Цитата Сообщение от kravam Посмотреть сообщение
в его методе start вызывается функция run, которая определена много позже, а именно в авторском класссе (NewThread в данном случае)
При создании объекта ему же передается this "авторского класса"
Java
1
t = new Thread(this);
в кострукторе вызывается метод init, куда передается твой this, а в init уже вот что
Java
1
this.target = target; // target - это то, что передавалось как this
ну а дальше можно предположить, что в самом примитивном виде вызов "авторского" run() выглядит так
Java
1
target.run();
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
04.01.2014, 00:35  [ТС] 4
Kastaneda, что-то я не пойму. Получается, в классе Thread объявлен метоd run, но реализован он в АВТОРСКОМ классе, да и вызывается соответствующим образом (target.run(). Получается, все классы суть дочерние не только от класса Object, но и от класса Thread?
0
Заблокирован
04.01.2014, 00:55 5
надо наверное начать с того, что Runnable это не класс, а интерфейс
что за авторский класс?
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
05.01.2014, 23:54  [ТС] 6
Ладно, попробуем по-другому. Если в двух словах, я хочу написать минимальный аналог функционала Thread+Runnable. Минимальный настолько, что мне вовсе даже не нужно создавать новый поток. Мне нужно чтобы вот этот вот мой код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 class NewThread implements Runnable_ {
  
   NewThread() {
     Thread_ t = new Thread_ (this);
     t.start(); 
   }
 
   
   public void run() {}
 }
 
class ThreadDemo {
  public static void main(String args[]) {
  }
}
Который, КСТАТИ есть аналог вот этому:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class NewThread implements Runnable {
  
   NewThread() {
     Thread t = new Thread(this);
     t.start(); 
   }
 
   
   public void run() {}
 }
 
class ThreadDemo {
  public static void main(String args[]) {
  }
}
компилился, только и всего. Вот я начал писать:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface Runnable_ { 
 void run(); 
}
 
class Thread_ {
 
 Object o_;
 Thread_ (Object o) {
  o_= o;
 }
 
 //Тут надо как-то указать, что предполагается, что объект o_ будет реализовывать
 //интерфейс Runnable_; если существует способ это сделать, тогда, наверное, функция start
 //будет корректна, сейчас же компилятор на неё ругается.
 void start () {
  o_.run();
 }
 
 
}
 
class ThreadDemo {
  public static void main(String args[]) {
  }
}
пытаюсь быть понятным.
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
06.01.2014, 10:30 7
Вместо
Java
1
2
3
4
 Object o_;
 Thread_ (Object o) {
  o_= o;
 }
нужно
Java
1
2
3
4
Runnuble_ o; // нам же нужен Runnuble_, поэтому его и используем
Thread_ (Runnuble_ o) {
    this.o = o;
}
1
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
06.01.2014, 14:30 8
Цитата Сообщение от kravam Посмотреть сообщение
Kastaneda, что-то я не пойму. Получается, в классе Thread объявлен метоd run, но реализован он в АВТОРСКОМ классе, да и вызывается соответствующим образом (target.run(). Получается, все классы суть дочерние не только от класса Object, но и от класса Thread?
Честное слово, вы обкурились чего-то. Хоть бы удосужились открыть в среде класс Tread, и посмотреть его устройство.

если вам нужен аналог без создания потока, то вот как упрощённо оно будет:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
interface MyRunnable {
    public void run();
}
 
class MyThread implements MyRunnable {
 
    public MyThread(MyRunnable runnable) {
        this.runnable = runnable;
        start();
    }
    
    public MyThread() {
        runnable = null;
        start();
    }
    
    @Override
    public void run() {
        // do nothing
    }
    
    /* запуск только через эту процедуру! */
    public void start() {
        if (runnable == null) run();
        else runnable.run();
    }
    
    // ссылка на вашу "авторскую" (ну и название) реализацию MyRunnable
    private MyRunnable runnable;
}
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
07.01.2014, 21:22  [ТС] 9
Kastaneda, да, всё так.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Create a second thread.
interface Runnable_ { 
 void run(); 
}
 
class Thread_ {
 
 Runnable_ o;
 Thread_ (Runnable_ o) {
    this.o = o;
 }
 
 void start () {
  o.run();
 }
 
 
}
 
 
class NewThread implements Runnable_ {
  Thread_ t;
 
  NewThread() {
    // Create a new, second thread
    t = new Thread_(this);
     t.start(); // Start the thread
  }
 
  // This is the entry point for the second thread.
  public void run() {System.out.println("run вызвана");}
}
 
 
 
 
class ThreadDemo_ {
  public static void main(String args[]) {
   new NewThread ();
  }
}
И хоть я и изучил интерфейсы, мне бы самому и в голову не пришли эти вот конструкции:

Java
1
2
3
4
5
6
7
Runnable_ o;
//////.....
  Thread_ t;
 
  NewThread() {
    // Create a new, second thread
    t = new Thread_(this);
ибо опыта с гулькин нос
0
1903 / 1014 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
07.01.2014, 21:24 10
Так начните книги читать - мне, например, очень помогло в изучении явы
И юзайте IDE, например, NetBeans.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
07.01.2014, 21:29  [ТС] 11
Цитата Сообщение от deathNC Посмотреть сообщение
Так начните книги читать
вы блин прямо сама оригинальность
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11050 / 6996 / 1657
Регистрация: 25.07.2009
Сообщений: 12,764
10.01.2014, 02:37 12
Цитата Сообщение от kravam Посмотреть сообщение
вы блин прямо сама оригинальность
kravam, ну да, Вам это, помню, ещё в С++ разделе советовали...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SimpleThread {
    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println("Hello from thread!");
            }
        };
        
        t.start();
        try {
            t.join();
        }
        catch ( InterruptedException e ) {}
    }
}
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
10.01.2014, 15:43  [ТС] 13
Цитата Сообщение от easybudda Посмотреть сообщение
kravam, ну да, Вам это, помню, ещё в С++ разделе советовали...
Чтобы не было непоняток, изъясняйтесь по сути. Я смахиваю на невежу?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

А что вы написали? Насколько я могу судить, это способ номер 2 создания потока; таковой он в книге Шилдта. Переопределяем Thread.run, стартуем, и? Зачем вы это?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11050 / 6996 / 1657
Регистрация: 25.07.2009
Сообщений: 12,764
10.01.2014, 16:16 14
Цитата Сообщение от kravam Посмотреть сообщение
Чтобы не было непоняток, изъясняйтесь по сути. Я смахиваю на невежу?
Просто вспомнилось, а на кого Вы там смахиваете - сами определяйтесь.

Цитата Сообщение от kravam Посмотреть сообщение
А что вы написали?
Самый простой способ создать отдельный поток выполняющий какую-то задачу. У Шилдта я не припомню примера с анонимным классом - наследником Thread, там явно класс - наследник создавался (с вызовом своего же метода start() из конструктора)...
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
10.01.2014, 16:32  [ТС] 15
Цитата Сообщение от easybudda Посмотреть сообщение
Просто вспомнилось, а на кого Вы там смахиваете - сами поределяйтесь.
эх вы. Даже ответить за свои слова не в состоянии.
0
2582 / 2255 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
10.01.2014, 17:08 16
kravam, вам намекали что ваш вопрос описан в любой книжке по JavaSE и с ним связана аннотация @Override
на мой взгляд такой вопрос недостоин человека с вашей репутацией на форуме
Не понимаю к чему эти перепирательства и выяснения кто есть кто и кто кого круче
может просто стоит последовать совету?
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
10.01.2014, 18:20  [ТС] 17
Цитата Сообщение от mutagen Посмотреть сообщение
kravam, вам намекали что ваш вопрос описан в любой книжке по JavaSE и с ним связана аннотация @Override
ага, вон оно что! А я-то гадаю, чего это...
Цитата Сообщение от deathNC Посмотреть сообщение
Честное слово, вы обкурились чего-то.
За такие намёки пивными кружками убивать надо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2014, 18:20

В классе OnlyData написать метод, который выводит значение переменной i и вызвать этот метод в том же классе
Я конечно понимаю, что задача оч простая, но все же. В классе OnlyData нужно написать метод,...

Ошибка: Метод расширения должен быть определен в неуниверсальном статистическом классе
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая...

Как работает метод TrimExcess() в классе Queue? Если можно приведите пример
Здравствуйте. Подскажите как работает метод TrimExcess() в классе Queue. Если можно приведите...

Почему если делегат события определен в другом классе, то не получается создать генерацию события?
В проекте №1 объявлен делегат для события: delegate void StateEventHandler(State state); А в...

Вызов метода базового класса игнорируя переопределенный метод в производном классе
Как вызвать метод базового класса игнорируя переопределенный метод в производном классе. PS...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.