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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очередь потоков, Два потока по очереди выводят данные 
:(
    Опции темы
leyla89
Дата 16.10.2013, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. Два потока должны выводить по очереди слова из предложения.
2. Алфавит. Один поток выводит на консоль гласные буквы, другой согласные. 
Подскажите, пожалуйста, как этого добиться... Вот, что у меня пока что есть: 

Код
public class ThreadOfWords extends Thread{ 
public ThreadOfWords(String str){ 
super(); 
setName(str); 
}

public synchronized void run(){
    String [] mas1 = {"My", "is", "I", "java."};
    String [] mas2 = {"name", "Leyla.", "like", ":)"};
    String [] mas3 = {"a", "e", "i", "o", "u"};
    String [] mas4 = {"b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"};
    String nameT = getName();

    if("First".equals(nameT)){
        for(int i = 0; i < mas1.length; i++){
            System.out.println(mas1[i]);
            try{
                Thread.sleep(200);
            } catch(InterruptedException e){
                System.out.println(nameT + "прерван");
            }
        }
    } else if("Second".equals(nameT)){
        for(int i = 0; i < mas2.length; i++){
            System.out.println(mas2[i]);
            try{
                Thread.sleep(200);
            } catch(InterruptedException e){
                System.out.println(nameT + "прерван");
            }
        }
    } else if("Third".equals(nameT)){
        for(int i = 0; i < mas3.length; i++){
            System.out.println(mas3[i]);
            try{
                Thread.sleep(500);
            } catch(InterruptedException e){
                System.out.println(nameT + "прерван");
            }
        }
    } else if("Fourth".equals(nameT)){
        for(int i = 0; i < mas4.length; i++){
            System.out.println(mas4[i]);
            try{
                Thread.sleep(500);
            } catch(InterruptedException e){
                System.out.println(nameT + "прерван");
            }
        }
    }       
}
}

public class Words { 
public static void main(String[] args) { 
ThreadOfWords tr1 = new ThreadOfWords("First"); 
ThreadOfWords tr2 = new ThreadOfWords("Second");

    tr1.setPriority(10);
    tr2.setPriority(1);

    tr1.start();
    tr2.start();                
}
}

public class ABC { 
public static void main(String[] args) { 
ThreadOfWords tr1 = new ThreadOfWords("Third"); 
ThreadOfWords tr2 = new ThreadOfWords("Fourth");

    tr1.setPriority(10);
    tr2.setPriority(1);

    tr1.start();
    tr2.start();
}
}

PM MAIL   Вверх
Magistrus
Дата 17.10.2013, 14:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Жив
*


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

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



к слову, "y" может быть как гласной так и согласной, в зависимости от места в слове

Добавлено @ 14:41
Цитата(leyla89 @  16.10.2013,  19:16 Найти цитируемый пост)
по очереди


Суть многопоточности в том, что процессы работают паралельно и гарантировать порядок вывода нельзя, если не принять особых мер .

вместо кучи if  можно использовать case если передавать в конструктор экземпляр enum 

Код

public class ThreadOfWords extends Thread
{
private static final List<String> SOURCE1 = Arrays.asList(new String[]{"My","name", "is", "Leyla.",  "I", "like", "java.", ":)"});
private volatile  count;
private List<String> source;
private List<String> target;

public ThreadOfWords(Order order)

  super(); 
  setName(order.name()); 
  switch (order)
  {
      case First:
            source = SOURCE1;
            target =  Arrays.asList(new String [] {"My", "is", "I", "java."});
            break; 
      case Second:
            source = SOURCE1;
            target =  Arrays.asList(new  String []{"name", "Leyla.", "like", ":)"});
            break;
   }
}
public void run(){
    
    while(count < source.size())  
    {
          if target.contains((source.get(count)))
          {
             System.out.println(source.get(count)) ;
             count++;
           }
     }
}

enum Order
{
  First,
  Second,
  Third,
  Fourth
}
}


Это сообщение отредактировал(а) Magistrus - 17.10.2013, 15:47
--------------------
~ вот такая вот загагулина ~ 
PM MAIL WWW ICQ Skype   Вверх
Magistrus
Дата 17.10.2013, 15:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Жив
*


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

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



как то так
--------------------
~ вот такая вот загагулина ~ 
PM MAIL WWW ICQ Skype   Вверх
Stolzen
Дата 18.10.2013, 08:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

static class CharConsumer implements Runnable {

    private final BlockingQueue<Character> q;
    private boolean stop = false;

    public CharConsumer(BlockingQueue<Character> q) {
        this.q = q;
    }

    @Override
    public void run() {
        while (!stop) {
            try {
                doRun();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    private void doRun() throws InterruptedException {
        Character nextChat = q.take();
        if (nextChat == '\0') {
            stop = true;
            return;
        }

        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " consumed: " + nextChat);
    }

}

public void produce() throws Exception {
    List<Character> vowels = Arrays.asList('a', 'e', 'i', 'o', 'u');
    char[] text = "I don't know how to google".toCharArray();

    BlockingQueue<Character> vowelsQueue = new LinkedBlockingQueue<>();
    BlockingQueue<Character> consonantsQueue = new LinkedBlockingQueue<>();

    Thread vowelsThread = new Thread(new CharConsumer(vowelsQueue));
    Thread consonantsThread = new Thread(new CharConsumer(consonantsQueue));

    vowelsThread.start();
    consonantsThread.start();

    for (char c : text) {
        if (Character.isLetter(c)) {
            Character chr = Character.valueOf(c);

            if (vowels.contains(chr)) {
                vowelsQueue.offer(chr);
            } else {
                consonantsQueue.offer(chr);
            }
        }
    }

    vowelsQueue.offer('\0');
    consonantsQueue.offer('\0');

    vowelsThread.join();
    consonantsThread.join();
}




--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Pawl
Дата 18.10.2013, 10:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(leyla89 @  16.10.2013,  19:16 Найти цитируемый пост)
2. Алфавит. Один поток выводит на консоль гласные буквы, другой согласные. 

Если очередность вывода соблюдать не обязательно, можно сделать так:
Код

package threadsVowelsConsonants;

public class Main {
    public static final String ABC = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    public static String VOWELS = "аеёиоуыэюя";
    public static final String CONSONANT = "бвгджзйклмнпрстфхцчшщъь";

    public static void main(String[] args) {
        VowelConsonant c = new VowelConsonant(VOWELS);
        VowelConsonant v = new VowelConsonant(CONSONANT);
        v.start();
        c.start();
    }
}

Код

package threadsVowelsConsonants;

import static threadsVowelsConsonants.Main.ABC;

public class VowelConsonant implements Runnable {
    private String letters;

    public VowelConsonant(String l) {
        letters = l;
    }

    public void start() {
        new Thread(this).start();
    }

    @Override
    public void run() {
        for (int i = 0; i < ABC.length(); i++) {
             if (letters.contains(new Character(ABC.charAt(i)).toString())) {
                 System.out.println(Thread.currentThread().getName() + ABC.charAt(i));
             }
        }
    }
}

Цитата(leyla89 @  16.10.2013,  19:16 Найти цитируемый пост)
1. Два потока должны выводить по очереди слова из предложения.

Код

import java.util.concurrent.Exchanger;

public class Main {
    public static final String PROPOSAL = "My name is leyla I like java";
    public static final String[] WORDS = PROPOSAL.split(" ");

    public static void main(String[] args) {
        Exchanger<Boolean> exchanger = new Exchanger<>();
        MessageWriter mw = new MessageWriter(exchanger, WORDS);
        mw.start();
        boolean canWrite = true;
        for (String word : WORDS) {
            try {
                canWrite = exchanger.exchange(canWrite);
                if (canWrite) {
                    System.out.println(Thread.currentThread().getName() + " " + word);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Код

import java.util.concurrent.Exchanger;

public class MessageWriter implements Runnable {
    private Exchanger<Boolean> exchanger;
    private String[] words;
    private boolean canWrite = false;

    public MessageWriter(Exchanger<Boolean> exchanger, String[] words) {
        this.exchanger = exchanger;
        this.words = words;
    }

    public void start() {
        new Thread(this).start();
    }

    @Override
    public void run() {
        for (String word : words) {
            try {
                canWrite = exchanger.exchange(canWrite);
                if (canWrite) {
                    System.out.println(Thread.currentThread().getName() + " " + word);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Тут работают 2 потока - 1 основной (main) и один дополнительный.

Это сообщение отредактировал(а) Pawl - 18.10.2013, 19:38


--------------------
В действительности всё совсем не так, как на самом деле
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.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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