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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> message for thread 
:(
    Опции темы
sol78
Дата 1.9.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Значит дело обстоит так.. есть куча threadов нужно в определенный момент собщить нужному threadу что нужно закончить, например, начатое и остановиться...
Ищу эллегантный способ это сделать!?
Зарание благодарна!
PM MAIL   Вверх
dorogoyIV
Дата 2.9.2007, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вот немного поизвращался  smile .
здесь по нажатию кнопки запускается новый поток. по клику мыши можно приостановить и продолжить.
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ManyThreads extends JFrame implements ActionListener
{
 JButton jb=new JButton("New Thread");

 ManyThreads()
 {
  setBounds(100,100,400,300);
  setLayout(new FlowLayout());
  add(jb);
  jb.addActionListener(this);
 }

 public void actionPerformed(ActionEvent e)
 {
  add(new Threads().jl);
 }

 public static void main(String[]args)
 {
  JFrame f=new ManyThreads();
  f.setVisible(true);
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}

class Threads extends Thread implements MouseListener
{
 boolean suspended=false;
 int i=0;
 JLabel jl=new JLabel();

 Threads()
 {
  start();
  jl.addMouseListener(this);
  jl.setOpaque(true);
 }

 public void mouseClicked(MouseEvent e)
 {
  if(suspended)
  {
   Resume();
  }
  else 
   Suspend();
 }
 public void mousePressed(MouseEvent e){}
 public void mouseReleased(MouseEvent e){}
 public void mouseExited(MouseEvent e)
 {
  jl.setBackground(new Color(238,238,238));
 }
 public void mouseEntered(MouseEvent e)
 {
  jl.setBackground(Color.GREEN);
 }

 public void Suspend()
 {
  suspended=true;
 }

 public synchronized void Resume()
 {
  suspended=false;
  notify();
 }

 public void run()
 {
  while(true)
  {
   try
   {
    sleep(1000);
    synchronized(this)
    {
     while(suspended)
      wait();
    }
   }
   catch(Exception ex){}
   i++;
   jl.setText(Integer.toString(i));
  }
 }
}



Это сообщение отредактировал(а) dorogoyIV - 2.9.2007, 01:33
PM MAIL   Вверх
COVD
Дата 2.9.2007, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



"Эллегантного" способа нет и быть не может. Поток просто выполняет последовательность команд на своем пути. Если он, например, вошел в блок синхронизации, т.е. закрыл обьект для других потоков, и вдруг ему пришла команда остановиться, то обьект останется навечно запертым для других потоков, т.е. недоступным. Чтобы корректно остановиться, потоку нужно снять все замки (lock) с обьектов, которые он понавешал (т.е. исполнять код пока не выйдет из блоков синхронизации). Это уже компетенция программиста, как это сделать лучше. Как в примере выше, эта задача решается путем выставления флагов на пути потока. Если флаг имеет определенное значение, то метод run() должен завершиться (через break() или return()) . И программист должен предусмотреть код, который надо выполнить при выходе: снять все ненужные замки, закрыть открытые соединения и прочие действия для корректного останова потока. 
PM MAIL   Вверх
niasilil
Дата 2.9.2007, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dorogoyIV, это ты зря функцию Suspend() обозвал, чего то я даже напрягся поначалу. smile

Проблема с wait notify в твоем коде в том что ты заранее не знаешь какой thread запустится
Object
Цитата
Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.



--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
dorogoyIV
Дата 2.9.2007, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(niasilil @  2.9.2007,  02:54 Найти цитируемый пост)
Проблема с wait notify в твоем коде в том что ты заранее не знаешь какой thread запустится

а там не нужно знать  smile 
PM MAIL   Вверх
niasilil
Дата 2.9.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dorogoyIV @ 2.9.2007,  03:06)
Цитата(niasilil @  2.9.2007,  02:54 Найти цитируемый пост)
Проблема с wait notify в твоем коде в том что ты заранее не знаешь какой thread запустится

а там не нужно знать  smile

Как же не нужно, если я кликаю на такой то thread и он бац, не запустился, а запустился соседний.  smile 
Ты не пойми чего, я не критикую, просто напомнил. smile 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
dorogoyIV
Дата 2.9.2007, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



niasilil, а у меня такого нету - все нормально работает 
PM MAIL   Вверх
niasilil
Дата 2.9.2007, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dorogoyIV @ 2.9.2007,  03:17)
niasilil, а у меня такого нету - все нормально работает

> ...The choice is arbitrary and occurs at the discretion of the implementation. ...

Я только хотел отметить, что это не значит что на каком нибудь линуксе это так же будет работать. Не гарантируется.


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
w1nd
Дата 2.9.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



dorogoyIV, niasilil прав - лучше использовать notifyAll(). А я бы сделал примерно так:
Код
public class MyThread extends Thread {

    private Lock lock = ...;

    public void pause() {
        lock.lock();
    }

    public void unpause() {
        lock.unlock();
    }

    public void run() {
        while (!Thread.interrupted()) {
            lock.lock();
            try {
                ...
            }
            finally {
                lock.unlock();
            }
        }
    }

}


Это сообщение отредактировал(а) w1nd - 2.9.2007, 18:56


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


Опытный
**


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

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



Я запуталась, мне не нужно синхронизировать потоки, мне только нужно принимать от них сообщения и и отправлять данному потоку сообщения.Проблема только в том что я не знаю как эллегантно идентифицировать поток?
Можно какойто простой пример с объяснением, плиз!?

Добавлено через 9 минут и 3 секунды
Да и мне нужно именно знать откуда пришел мессадже
PM MAIL   Вверх
sol78
Дата 2.9.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dorogoyIV, 
 а как передать из потока мессадже, и как определить от какого среда мессадж???
PM MAIL   Вверх
w1nd
Дата 2.9.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



У потоков есть name. Получить текущий поток можно с помощью Thread.currentThread(). Если вам нужно остановить поток, то для этого нужно использовать блокировку с помошью wait()/notify() или с помощью защёлок, как показал я (потоки нельзя запускать повторно).


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


Эксперт
***


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

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



w1nd уже ответил. ну так для полной ясности - в тот код, что я дал, в любой метод mouseXXX(MouseEvent e) добавь строку System.out.println(getName()); . будет наглядно
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.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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