powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как забрать данные из потока
32 сообщений из 32, показаны все 2 страниц
Как забрать данные из потока
    #34060998
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно забрать данные из отдельно выполняемого потока ?

Структура программы примерно следующая:

Main -> Обновление данных по схемам
Main -> Ожидание данных для обработки и их обработка по заданной схеме

То есть поток выполняется бесконечно - как из него передать информацию туда откуда он вызывался ? Чтобы потом уже можно было работать с этой информацией.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061013
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из отдельно работающей ява машины вы наверное имели ввиду? тогда RMI вам поможет.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061051
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не совсем понял ? Прога будет выполнятся на одной виртуальной машине а что за RMI, простите не знаю что это.....
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061362
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При инициализации дополнительного потока передать ему ссылку на главный поток и дергать какой-либо метод главного (типа "накачать данные") из дополнительного.
Что может быть проще?
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061410
muchacho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
он жеПри инициализации дополнительного потока передать ему ссылку на главный поток и дергать какой-либо метод главного (типа "накачать данные") из дополнительного.
Что может быть проще?

по-моему у него нету главного и дополнительного потока.

автор
Main -> Обновление данных по схемам
Main -> Ожидание данных для обработки и их обработка по заданной схеме
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061496
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muchacho
по-моему у него нету главного и дополнительного потока.

Абсолютно монопенисуально - главный и зависимый, либо оба дочерние.
Ну какая разница-то?
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061657
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дочерний и главный поток, что-то странное (или я?..)
Обычными методами синхронизации решается задача, смотреть в сторону задачи "писатель и читатель" - решений должно быть море в интернете.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061671
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во! человек дело сказал. Ну или нанимайте меня например :)
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061675
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidv
У автора проблема в том, чтобы понять - куда писать-то?
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34061681
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эээ, забыл пояснить: main это public static void метод, являющийся точкой входа в приложение, другими словами, вы описали две разные точки входа (скажем разными bat файлами запускаются jar №1 и jar №2). Именно из этого был сделан вывод о разных средах выполнения.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063106
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он жеПри инициализации дополнительного потока передать ему ссылку на главный поток и дергать какой-либо метод главного (типа "накачать данные") из дополнительного.
Что может быть проще?Интересно, как это будет выглядеть :) Как вы собираетесь "дернуть" метод другого потока? И что вообще значит метод другого потока?
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063271
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JozicИнтересно, как это будет выглядеть :) Как вы собираетесь "дернуть" метод другого потока? И что вообще значит метод другого потока?
Если мы имеем в виде поток Thread (а я лично его и имею в виду) - элементарно.

Код: plaintext
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.
 class  X  implements  Runnable {
Runnable r =  null ;
  public  X (Runnable iface){
  this .r = iface;
}
  public   void  run(){
...
  if  (r !=  null ) r.callme();
...
 }
  public   void  callme(){
...  do  something
 }
}


{
 Runnable run1 =  new  X( null );
 Runnable run2 =  new  X(run1);
 
 Thread thread1 =  new  Thread(run1);
 Thread thread2 =  new  Thread(run2);
 
 thread1.start();
 thread2.start();
}
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063273
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, не будет проблем понять - как вызывать и метод основного (main'а).
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063300
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, автор надеюсь понял - нужно не забирать данные из потока, а поток должен передавать данные.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063445
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
он жеДа, кстати, автор надеюсь понял - нужно не забирать данные из потока, а поток должен передавать данные.

Спасибо за то что откликнулись..... Я уже пробовал передавать данные в main но выдаёт ошибки я создавал отдельный класс для принятия данных как в main так и в другом классе. Выдавало ошибку что данные должны быть статик - ставил как просило потом уже в процессе запуска выдавало ошибку. Короче я запутался
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063573
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.etu1362.spb.ru/ в информации лежать мои лабораторные работы к системам реального времени. Посмотрите, может поможет. Я их год назад делал.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063672
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же JozicИнтересно, как это будет выглядеть :) Как вы собираетесь "дернуть" метод другого потока? И что вообще значит метод другого потока?
Если мы имеем в виде поток Thread (а я лично его и имею в виду) - элементарно.

Код: plaintext
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.
 class  X  implements  Runnable {
Runnable r =  null ;
  public  X (Runnable iface){
  this .r = iface;
}
  public   void  run(){
...
  if  (r !=  null ) r.callme();
...
 }
  public   void  callme(){
...  do  something
 }
}


{
 Runnable run1 =  new  X( null );
 Runnable run2 =  new  X(run1);
 
 Thread thread1 =  new  Thread(run1);
 Thread thread2 =  new  Thread(run2);
 
 thread1.start();
 thread2.start();
}
Во-первых у Runnable нет метода callme(), а во-вторых вызов метода callme() произойдет в текущем потоке, даже если этот метод - метод объекта Thread (имхо стоит называть вещи своими именами :) ). И в-третих достаточно иметь ссылку на объект данных чтобы получить эти данные, и совсем не обязательно знать каким образом эти данные изменяюцца - из текущего или из другого потока.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063848
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мде... а код то можно ваш увидеть, а то чего тока не наплели...
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34063963
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JozicВо-первых у Runnable нет метода callme(), а во-вторых вызов метода callme() произойдет в текущем потоке, даже если этот метод - метод объекта Thread (имхо стоит называть вещи своими именами :) ). И в-третих достаточно иметь ссылку на объект данных чтобы получить эти данные, и совсем не обязательно знать каким образом эти данные изменяюцца - из текущего или из другого потока.
Во-первых, вы издеваетесь что-ли? При чем тут интерфейс Runnable? Я же пишу свой класс, его юзающий.
Во-вторых, что вы подразумеваете под текущим потоком?
В-третьих, вы вообще ап чем?
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34064137
Jozic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же JozicВо-первых у Runnable нет метода callme(), а во-вторых вызов метода callme() произойдет в текущем потоке, даже если этот метод - метод объекта Thread (имхо стоит называть вещи своими именами :) ). И в-третих достаточно иметь ссылку на объект данных чтобы получить эти данные, и совсем не обязательно знать каким образом эти данные изменяюцца - из текущего или из другого потока.
Во-первых, вы издеваетесь что-ли? При чем тут интерфейс Runnable? Я же пишу свой класс, его юзающий.
Во-вторых, что вы подразумеваете под текущим потоком?
В-третьих, вы вообще ап чем?
Во-первых, не издеваюсь, а просто придолбался :):
Код: plaintext
1.
2.
Runnable r =  null ;
...
 if  (r !=  null ) r.callme();
это ваш код :)
Во-вторых: под текущим я понимаю, выполняющийся в данный момент поток. Но имелось в виду то, что в вашем примере вызвался метод объекта Х имплементирующего Раннбл, но не "метод другого потока". Можно ввестись в заблуждение, читая такое :)
В-третих, я о том что как уже ранее говорилось: LeonidvДочерний и главный поток, что-то странное (или я?..)
Обычными методами синхронизации решается задача, смотреть в сторону задачи "писатель и читатель" - решений должно быть море в интернете. при описанной автором схеме, можно найти более простое решение
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072115
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я решил сделать отдельный проект просто для тестирования работы потока.....

main класс

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
/*
 * Date: 21.10.2006
*/

 public   class  Main {
     public   static   int  M1[] =  new   int [ 5 ];
     public   static   void  main(String args[])
    {
        //int M1[] = new int[5];
        //int M2[] = new int[5];
        //int M3[] = new int[5];
        //int M1[] = {0,0,0,0,0};

        T1 t1 =  new  T1("New Thread");
         int  a = M1[ 0 ];
         int  b = M1[ 1 ];
         int  c = M1[ 2 ];
         int  d = M1[ 3 ];
         int  e = M1[ 4 ];
        System.out.println("Array M1 = " + a + " " + b + " " + c + " " + d + " " + e);
    }
}

класс потока

Код: plaintext
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.
/*
 * Date: 21.10.2006
*/

 public   class  T1  implements  Runnable{
    String name;
    Thread t;

    T1(String thread_name)
    {
        name = thread_name;
        t =  new  Thread( this , name);
        System.out.println("Новое имя потока: " + t);
        t.start();//запуск метода run()
    }

     public   void  run()
    {
         try 
        {
             for ( int  i= 0 ;i< 5 ;i++)
            {
                Main.M1[i] = i;
                Thread.sleep( 1000 );
            }
        }
         catch (InterruptedException e)
        {
            System.out.println(name + ":" + "неожиданно завершён");
        }
        System.out.println(name + ":" + "завершён нормально");
    }
}

и в итоге интересная ситуация..... просто запуская программу получаем в консоли

Новое имя потока: Thread[New Thread,5,main]
New Thread:завершён нормально
Array M1 = 0 0 0 0 0

при запуске через дебагер при просмотре как что и куда пишется получаем....

Новое имя потока: Thread[New Thread,5,main]
New Thread:завершён нормально
Array M1 = 0 1 2 3 4

в чём здесь ошибка почему я не могу вывести данные при простом запуске ????
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072116
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В-общем, вы не представляет, что у вас происходит и почему, правда?

У вас есть два пути.

а) Купить (скачать, открыть имеющуюся) книгу по основам Java (раздел потоки) и прочитать про то, как там всё функционируют. Это хорошо, т.к. вы научитесь и в будущем будете работать, зная...

б) Я могу вам привести работающий пример того, как нужно передавать данные. Это плохо, т.к. вы просто схаваете готовое решение и скоро всё забудете.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072119
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jozic Но имелось в виду то, что в вашем примере вызвался метод объекта Х имплементирующего Раннбл, но не "метод другого потока". Можно ввестись в заблуждение, читая такое :)

Главное - идея :)
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072130
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ENigMA2meв чём здесь ошибка почему я не могу вывести данные при простом запуске ????
Скажу лишь, что главная ошибка - ожидание того, что данные немедленно будут доступны сразу после создания объекта new T1("New Thread").
И, кстати, надпись на экране должна быть вида (порядок следования)

New name: Thread[New Thread,5,main]
Array M1 = 0 0 0 0 0
New Thread:success

что логично, а не

ENigMA2me
Новое имя потока: Thread[New Thread,5,main]
New Thread:завершён нормально
Array M1 = 0 0 0 0 0
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072131
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, t.start() - это отнюдь не запуск метода run :)
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072172
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
он жеИ, кстати, t.start() - это отнюдь не запуск метода run :)

Странно а в книге Г. Шилда написано что start() выполняет вызов метода run()....

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

Подскажите как сделать так чтобы ожидать записи информации..... Если не хотите раскрывать хитрые коды просто напишите чем пользоваться - а дальше буду умные книги читать....
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072201
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот добавил следующий код в main():

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 try 
        {
            Thread.sleep( 10000 );
        }
         catch  (InterruptedException e)
        {
            System.out.println("11111");
        }
         try 
        {
            t1.t.join();
        }
         catch (InterruptedException ie)
        {
            System.out.println("22222");
        }
        System.out.println(t1.A1[ 0 ] + " " + t1.A1[ 1 ] + " " + t1.A1[ 2 ] + " " + t1.A1[ 3 ] + " " + t1.A1[ 4 ]);

теперь показывает как надо, но как сделать чтобы данные обновлялись и их в любой момент можно забирать не дожидаясь завершения потока ? У меня будет бесконечный цикл в потоке - типо обновление инфы через заданный промежуток времени.....
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072207
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ENigMA2me
Странно а в книге Г. Шилда написано что start() выполняет вызов метода run()....

Как бы вам сказать...
Предназначение Thread - выполнение потока параллельно с текущим (грубо говоря). Вы стартуете Thread и он начинает работать в фоне (опять грубо говоря). Т.е. вызывается t.start() и тут же передается управление дальше по тексту. А вы сначала выводите чиселки, и только потом поток в фоне обновит static массив. Вот и получается совсем не то, что ожидается.


Не буду буферизовать.


Код: plaintext
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
 import  java.util.concurrent.locks.*;

 public   class  ThreadsSample {
     public   static   void  main(String args[]){

         new  Thread( new  ProcessorThread()).start();
         new  Thread( new  DrawerThread()).start();
    }
    
     private   static   boolean  ready = false;
     private   static   double  data = 0d;
     private   static  Lock readyLock =  new  ReentrantLock();
    
    
     public   static   void  putData( double  number){
        System.out.println("I received " + number + " and ready to proceed");
        readyLock.lock();
         try {
            ready = true;
            data = number;
        }  finally  {
          readyLock.unlock();
        }
    }
    
     public   static   boolean  getReady(){
        readyLock.lock();
         try {
             return  ready;
        }  finally  {
          readyLock.unlock();
        }
    }
    
     public   static   double  getData(){
        readyLock.lock();
         try {
            ready = false;
             return  data;
        }  finally  {
          readyLock.unlock();
        }
    }

}

 class  ProcessorThread  implements  Runnable {
     public   void  run(){
         try {
             while  (true) {
                ThreadsSample.putData(Math.random());
                Thread.sleep( 1000 );
            }
        }  catch  (InterruptedException e){
            e.printStackTrace();
        }
    }
}

 class  DrawerThread  implements  Runnable {
     public   void  run(){
         try {
             while  (true) {
                 if  (ThreadsSample.getReady()) {
                     double  data = ThreadsSample.getData();
                    System.out.println("We got something new :) = " + data);
                }
                Thread.sleep( 300 );
            }
        }  catch  (InterruptedException e){
            e.printStackTrace();
        }
    }
}
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072208
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда, вот что значит посоветоваться со стаей товарищей - предложили мне вариант и я его малость доработал. Сделать поток без цикла внутри, а сам вызов потока сделать в цикле и внутри цикла ожидать завершения потока и принятия данных. Теперь должно быть всё в шоколаде. Спасибо всем за вашу помощь и поддержку.
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072209
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ENigMA2meМда, вот что значит посоветоваться со стаей товарищей - предложили мне вариант и я его малость доработал. Сделать поток без цикла внутри, а сам вызов потока сделать в цикле и внутри цикла ожидать завершения потока и принятия данных. Теперь должно быть всё в шоколаде. Спасибо всем за вашу помощь и поддержку.
Не дай вам бог так писать :(
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072210
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем тогда вообще вам поток-то???
...
Рейтинг: 0 / 0
Как забрать данные из потока
    #34072218
ENigMA2me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ваш примерчик увидел уже после своего ответа :( Он грамотнее. А поток - чтобы вычисления проводились без вмешательства, чтобы всегда были свежие данные, автоматизация процесса..... чтобы из других мест программы обращаться к данным которые периодически обновляются. Понятно что я предложил не лучший вариант, но я только учусь правильно писать - для того и существуют советы на форумах. С потоками я раньше не работал поэтому как заново открываю программирование.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как забрать данные из потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]