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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск и останов потока... Немогу остановить. 
:(
    Опции темы
Alone
Дата 29.9.2003, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



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

основной код:
Код

public void createAllObjects (){
 // создаем все необходимые объекты

 // создаем новый поток
 t = new TcpThread(this);
 ...
}


код потока.
Код

import java.io.*;
import java.net.*;
public class TcpThread implements Runnable {

   /** Creates a new instance of TcpThread */
   public TcpThread (pbxMain m) {
this.mainObj=m;
   }
   
   public void  newThread(){
try{
    t=new TcpThread (mainObj);
}
catch(Exception e){
    System.out.println(e.getMessage ());
}
tred=new Thread (t, "новый поток");
tred.start ();
System.out.println ("выполнен последний оператор метода main()");
   }
   
    public void stopThread(){
    try {
 Thread.currentThread ().interrupt ();
    }catch (Exception e){
 System.out.println(e.getMessage ());
    }
}

   public void run () {
System.out.println ("выполняется поток " + Thread.currentThread ().toString ());
boolean i=true;
int len=-1;
String buf="";

while(i){
    /*
    len=mainObj.conn.ReadTpkt ();
    if ( len > 0 ){
 buf=mainObj.conn.ReadMsg (len);
    }
    else if ( len < 0){
 
    }
     */
    try {
 tred.sleep(5000);
    }
    catch (Exception e){
    }
    System.out.println("-------------------------");
}
   }

   public pbxMain mainObj;
   public TcpThread t;
   public Thread tred;
}


и попытка останова потока из основного кода.
Код

public void removeAllObjects (){
 // удаляем объекты
 
 // удаляем поток
 this.t.stopThread ();
 ...
}

После этого поток продолжает работу как ни в чем не бывало...
даже ексепшн не помогает ничего эдакого отловить...



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

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


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

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



Метод stop() является Depricated, то-есть его использование устарело и может быть не реализованно в следующих версиях Java. Возможно в твоей версии в этом методе просто заглушка, которая ничего не делает.
Посмотри как можно корректно остановить поток здесь:
The Life Cycle of a Thread


--------------------
Account removed
PM MAIL   Вверх
Alone
Дата 29.9.2003, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Взгляни внимательно, я не использую метод stop. ДЛя этого у меня реализован метод stopThread, который в свою очередь вызывает Thread.currentThread ().interrupt ()
Но за ссылку ОГРОМНЫЙ сенкс!


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 29.9.2003, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Странна... Я что то из кода не могу понять - ты запускаешь 2-а одинаковых потока? Или как?

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



нет... С чего ты взял?
Из основного кода я создаю объект типа TcpThread t (это мой класс)
потом при необходимости я вызываю у этого объекта метод t.newThread() в котором стартует новый поток.



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 29.9.2003, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



t=new TcpThread (mainObj); - два раза используется...
Но это в общем то мелочи просто яб сделал чутка по другому smile.gif

Причина, почему тред не останавливается: метод интеррапт посылает InteruptedException.
В общем посмотри тут: http://java.sun.com/j2se/1.3/docs/guide/mi...eprecation.html

В твоем случае помогут небольшие шаманские танцы smile.gif. К примеру так: (сорри я чутка по другому написал - более красиво как мне кажется smile.gif )

В общем тред выглядит так:
Код

public class TestThread extends Thread
{
private Object main;
private boolean interrupted;

public TestThread( Object main )
{
 this.main = main;
 interrupted = false;
}

public void interrupt()
{
 interrupted = true;
 super.interrupt();
}


public void run()
{
 System.out.println ("выполняется поток " + toString() );
 boolean i = true;

 while( i && !interrupted )
 {
  try
  {
   sleep(1000);
  }
  catch (Exception e){}

  System.out.println( "******************" );
 }
}
}


запуск и останов треда выглядит так:
Код

 TestThread thread = new TestThread( "some object" );
 System.out.println("Start thread");
 thread.start();
 try
 {
  Thread.sleep( 10000 );
 }
 catch( Exception e ) {}
 System.out.println("Stop thread");
 thread.interrupt();      
 try
 {
  Thread.sleep( 10000 );
 }
 catch( Exception e ) {}


Это сообщение отредактировал(а) DarkDS - 29.9.2003, 22:42
PM MAIL   Вверх
DarkDS
Дата 29.9.2003, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



В общем вот... Посмотри - что не понятно...
PM MAIL   Вверх
Alone
Дата 30.9.2003, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Н-да. Покрасивше моего будет... smile.gif
Ошибку понял. принял к сведению... ПАСИБ!


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Anime
Дата 27.1.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 88
Регистрация: 13.11.2006
Где: Киев

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



Приделал кнопки 
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication19;

import java.awt.Button;
import java.awt.Container;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

/**
 *
 * @author Токио
 */
public class Main extends JFrame {

    Button start, stop;
    Panel p;
    NewClass thread;
    
    Main() {
        thread = new NewClass( "some object" );
        start = new Button("start");
        stop = new Button("stop");
        setSize(400,400);
        Container c = getContentPane();
        p = new Panel();
        p.add(start);
        p.add(stop);
        c.add(p);

        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 System.out.println("Start thread");
                 thread.start();
            }
        });

        stop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Stop thread");
                thread.interrupt();
            }
        });

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().setVisible(true);
    }
}



Вот это код потока, такой же как у DarkDS
Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication19;

/**
 *
 * @author Токио
 */
public class NewClass extends Thread {
private Object main;
private boolean interrupted;

public NewClass( Object main )
{
 this.main = main;
 interrupted = false;
}

    @Override
public void interrupt()
{
 interrupted = true;
 super.interrupt();
}


    @Override
public void run()
{
 System.out.println ("выполняется поток " + toString() );
 boolean i = true;

 while( i && !interrupted )
 {
  try
  {
   sleep(1000);
  }
  catch (Exception e){}

  System.out.println( "******************" );
 }
}
}



Нажимаем старт, поток запустился, потом стоп поток остановился. Но когда опять нажать старт выскакивает ексепшин. Как запустить опять повторно?
Код

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:595)
        at javaapplication19.Main$1.actionPerformed(Main.java:39)
        at java.awt.Button.processActionEvent(Button.java:392)
        at java.awt.Button.processEvent(Button.java:360)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Пэ Эс. На форуме облазил темы по потокам, Представленные варианты работают хорошо, но почему то когда повторно нажимаешь старт выпадает эксепшен  smile 

Это сообщение отредактировал(а) Anime - 27.1.2009, 13:17
PM   Вверх
math64
Дата 27.1.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



При нажатии на stop нитка завершает работу. После этого нужно создавать новый экземпляр
Код

        thread = null;
        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 if (thread == null) {
                   System.out.println("Start thread");
                   thread = new NewClass();
                   thread.start();
                 }
            }
        });

        stop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (thread != null) {
                  System.out.println("Stop thread");
                  thread.interrupt();
                  thread = null;
                }
            }

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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