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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки и данные 
:(
    Опции темы
CMYK
Дата 17.10.2009, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вопрос собственно в коментариях.

Код

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Start {

    private BlockingQueue<test> q = new LinkedBlockingQueue<test>();
    private int i;

    private Start(){

    }

    public void  run() {
        i=0;
        while (true) {
            try {
                Thread.sleep(1);
                i++;
                if(isOdd(i)){
                    final test tt = new test();
                    final Thread thread = new Thread(tt);
                    thread.setDaemon(true);
                    thread.start();
                    q.offer(tt);
                }else if(i>9){
                    System.exit(0);
                }

            } catch (InterruptedException ex) {
                Logger.getLogger(Start.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public static boolean isOdd(int i) {
        return (i & 1) != 0;
    }

    public static void main(String[] args ){
        new Start().run();
    }

private class test implements Runnable{

    private String myName;

    public test(){
        myName= i+"m";
        System.out.println("Какое то имя: " + myName);
    }
        public void run() {
            ////////////////////////////////////////////////////////
            //Проблемный участок кода. Может не единственный!?
            //Мне нужно переодически получать в одном потке из очереди
            //список имен (myName) всех остальных потоков
            //Как мне это сделать?
            int ii=0;
            String[] str = null;
            for (test sp:q) {
                str[ii]=sp.getName();
                ii++;
            }
            ///////////////////////////////////////////////////////
              String n = null;
            for(int j=0;j<str.length;j++){
                n+=str[j]+" ";
            }
            System.out.println("Список значений myName: "+n);

        }

    public synchronized String getName(){
        return myName;
    }
}

}

PM MAIL   Вверх
fixxer
Дата 17.10.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А в чем, собственно, первоначальная задача?


--------------------
user posted image
PM MAIL ICQ   Вверх
CMYK
Дата 17.10.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет fixxer. Вообще пишу сервер, а код такой привел для краткости, на огромный код смотреть никто не будет. Так вот нить test является нитью которая обрабатывает входящие сообщения на сервер, например: приконектился клиент, прислал сообщение такого рода [пароль]; [тип]; [имя]; [какойто текст] , если каойто текст = REG, то имя заносится в переменную myName. ну и, собственно, мне нужно иногда, чтобы главный клиент, пусть admin, хотя это не важно, получал имена всех приконектившихся клиентов, вот как раз это я не знаю как сделать.
Ну вот например проверяю существует ли такое имя так:

Код
Boolean check=false;
for (test sp:q) {
    if(sp.getName().equals([имя])){
        check=true;
    }
}
if(check){
    send("such name already exists");
}else{
    myName=new String([имя]);
    send("registration passed successfully");
}



Это сообщение отредактировал(а) CMYK - 17.10.2009, 22:16
PM MAIL   Вверх
dorogoyIV
Дата 18.10.2009, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(CMYK @  17.10.2009,  21:22 Найти цитируемый пост)
Вообще пишу сервер

ну вы же получаете

Цитата(CMYK @  17.10.2009,  21:22 Найти цитируемый пост)
[пароль]; [тип]; [имя]; [какойто текст]

ну и берите имя...
PM MAIL   Вверх
CMYK
Дата 18.10.2009, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Брал помещал в ConcurrentHashMap, точно фишка в синхронизации тут я как то не доганю никак!
Исходя из примера ниже растолкуете мне как заставить одну нить из очереди напечатать список всех имен нитей в очереди.
Блин конечно пример не очень удачный, но сервер смысла нет выкладывать строк моного очень


Код

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Start {
    Thread threads[] = new  Thread[Thread.currentThread().getThreadGroup().activeGroupCount()];
    private BlockingQueue<test> q = new LinkedBlockingQueue<test>();
    private int i;
    private int ii;
    private Start(){

    }

    public void  run() {
        i=0;
        ii=0;
        while (true) {
            try {
                Thread.sleep(1);
                i++;
                if(isOdd(i)){

                    final test tt = new test();
                    final Thread thread = new Thread(tt);
                    thread.setDaemon(true);
                    thread.start();
                    threads[ii]=thread;
                    q.offer(tt);
                    ii++;
                }else if(i>9){
                    System.exit(0);
                }

            } catch (InterruptedException ex) {
                Logger.getLogger(Start.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public static boolean isOdd(int i) {
        return (i & 1) != 0;
    }

    public static void main(String[] args ){
        new Start().run();
    }

private class test implements Runnable{



    public test(){
        Thread.currentThread().setName(i+"m");
        System.out.println("Какое то имя: " + Thread.currentThread().getName());
    }
        public void run() {
//не вьеду совершенно!
         if(ii==2){
            String[] str = null;
            int size = Thread.enumerate(threads);
            for (int i = 0; i < size; i++) {
              str[i] = threads[i].getName();
            }
            String n = null;
            for(int j=0;j<str.length;j++){
                n+=str[j]+" ";
            }
            System.out.println("Список: "+n);
         }
        }
}

}



PM MAIL   Вверх
CMYK
Дата 18.10.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такое фуфло написал!
Всё. Спасибо всем кто пытался мне помочь, ухожу в глубокий даун! smile 
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.