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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> About Swing Thtreads, Thread isn`t give variabl which stops it 
V
    Опции темы
Nodir
Дата 22.7.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Zdrastvuyte, izvenayus chto pishu ne russkim shriftom, potomushto seychas u moyom comp`e netu ix. Est vopros. GUI Swing prilojenie, est dve button`a "Start" "Stop". Po najatie Start`a zapuskaetsa perviy potok i uvelichivaet odnu peremennuyu. A po najatie Stop`a perviy Thread doljen zavershitsya, i vtoroy potok doljen brat znachenie uvelichennova peremennova. Esli est vremya kompiliruyte eto i posmotrite.
Код

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

public class TempThread extends JFrame implements ActionListener{
    public TempThread(String title){
     super(title);
     setSize(250, 150);
     setResizable(false);
     contentPane = getContentPane();
     GridLayout gr = new GridLayout(1, 2, 5, 5);
     contentPane.setLayout(gr);
     bStart = new JButton("Start");
     bStop = new JButton("Stop");
     contentPane.add(bStart);
     contentPane.add(bStop);
     addWindowListener(new WindowAdapter(){
         public void windowClosing(WindowEvent e){
             System.exit(0);
         }
     });
     bStart.addActionListener(this);
     bStop.addActionListener(this);
    }
    JButton bStart, bStop;
    Container contentPane;
    
    public static void main(String[] args) {
     TempThread wndw = new TempThread("Testing Threads");
     wndw.show();
    }
    public void actionPerformed(ActionEvent ev){
     String command = ev.getActionCommand();
     if (command.equals("Start")){
         FlWriter flw = new FlWriter("Start");
         flw.start();
     }     
     if (command.equals("Stop")){
         FlWriter flw = new FlWriter("Stop");
         flw.start();
     }
    }
}
class FlWriter extends Thread {
    public FlWriter(String bName){
        command = bName;
    }
    public /*volatile*/ boolean doStop = false;
    public long value = 123l;
    String command = "";
    public void run(){
        if (command == "Start"){
            write();
        }
        if (command == "Stop"){
            stoping();
        }
    }
    
    public void write(){
        try{    
            while (!doStop){
                System.out.println("Going...");
                System.out.println("value do = "+value+"\n\n");
                sleep(600);
                value += 10;
                if (doStop) break;
            }
        
        } catch (Exception ex){
            System.err.println("Something from sleep...");
        }
    }
    public void stoping(){
        try{
            doStop = true;
            System.out.println("\n\n\n doStop = "+doStop);
            System.out.println("value do = "+value+"\n\n");
        } catch (Exception ex){
            System.err.println("Hey, err "+ex);
        }        
    }
    public void contining(){
        try{
        } catch (Exception ex){
            System.out.println("Hey, err "+ex);
        }        
    }
}

 
PM MAIL   Вверх
LSD
Дата 22.7.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Строки сравниваются equals(), а не ==.

2. Если нажата кнопка Start, то ты запускаешь новый поток и выполняешь в нем write() (он и начинает писать в консоль).
А если нажата кнопка Stop, то ты запускаешь новый поток и выполняешь в нем stoping(), но это влияет только на этот поток. Он успешно завершает свою работу так ее и не начав.
К тому же ты никак не передаешь результат из первого потока во второй.

Тебе надо при нажатии Stop сказать для первого потока stoping() и дождаться когда он остановится (Thread.join()). Затем получить результат вычислений первого потока, создать второй, передав ему результат работы первого, и запустить второй поток. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Nodir
Дата 23.7.2006, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Во время работы первого потока как я могу вызвать для него stopping(). И какую роль играет здесь 
Thread.join(), подробнее pls, я не профессионал. Если можно   smile  
PM MAIL   Вверх
powerOn
Дата 23.7.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(Nodir @  23.7.2006,  07:22 Найти цитируемый пост)
Во время работы первого потока как я могу вызвать для него stopping()

Второй поток должен обладать ссылкой на объект первого потока, что бы иметь возможность посылать ему сообщения (т.е. вызывать его методы).

Цитата(Nodir @  23.7.2006,  07:22 Найти цитируемый пост)
И какую роль играет здесь Thread.join(), подробнее pls

Заместо Thread (насколько я понял) должна быть ссылка на первый объект-поток. Вызов метода join() для первого потока из контекста второго потока заставит пристановиться вызывающий поток (второй) до завершения работы первого. Второй поток как бы повисает на вызове метода join() Первый поток будет завершен, если его метод run() возвратит управление или он будет прерван по случаю выброса исключения. Как только первый поток завершит работу, вызов метода join() возвратит управление, тем самым выполнение второго потока возобновиться. 
Этот прием называется "объединение потоков" (join - англ. соединять, объединять, связывать, скреплять).

Цитата(Nodir @  23.7.2006,  07:22 Найти цитируемый пост)
я не профессионал

удивительно, я тоже!  smile 
 


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Если правильно понял то должен получится вот так, но не тот... Где ошибка?...
Вот изменение.
Код

class FlWriter extends Thread {
    /*-------------------*/Thread thrd;/*-------------------*/
    public FlWriter(String bName){
        command = bName;
    }...
          if (command.equals("Start")){
        /*-------------------*/thrd = Thread.currentThread();/*-------------------*/
        write();
    }...
    public void stoping(){
        try{
            doStop = true;
            /*-------------------*/thrd.join();/*--------------------*/
            System.out.println("\n\n\n doStop = "+doStop);
...
 
PM MAIL   Вверх
powerOn
Дата 23.7.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Посмотри вот этот код:
Код

import javax.swing.JOptionPane;

public class NewJFrame extends javax.swing.JFrame {
    MyThread1 thread1 = null;
    MyThread2 thread2 = null;
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }
    
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.GridLayout(0, 1));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });

        getContentPane().add(jButton1);

        jButton2.setText("\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439");
        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton2MouseClicked(evt);
            }
        });

        getContentPane().add(jButton2);

        pack();
    }// </editor-fold>
    
    private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
        thread2 = new MyThread2();
        thread2.setThread1(thread1);
        thread2.start();
        
    }
    
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
        thread1 = new MyThread1();
        thread1.start();
    }
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    // End of variables declaration
    
}

class MyThread1 extends Thread {
    private long counter = 0;
    private boolean stopFlag = true;
    public void run() {
        counter = 0;
        for(;stopFlag;) {
            System.out.println("counter = " + (++counter));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
    
    public long getCounter() {
        return counter;
    }
    
    public void stopThread() {
        stopFlag = false;
    }
    
    
}

class MyThread2 extends Thread {
    private long counter = 0;
    private MyThread1 thread1 = null;
    public void run() {
        if (thread1 != null && thread1.isAlive()) {
            thread1.stopThread();
            try {
                thread1.join();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        JOptionPane.showMessageDialog(null, "counter = " + thread1.getCounter());
    }
    
    
    public void setThread1(MyThread1 thread1) {
        this.thread1 = thread1;
    }
}


Имеется фрейм, на нем 2 кнопки. Нажатие первой кнопки создаст поток 1 (его класс MyThread1). Первый поток просто увеличивает свой внутренний счетчик и все. Нажатие на кнопку 2 приведет к созданию второго потока, который желает получить значение счетчика первого потока. Для того что бы это сделать он останавливает первый поток и ждет его завершения, послечего получает значения счетчика.
Вот код остановки и ожидания завершения первого потока (он в методе run() класса MyThread2):
Код

if (thread1 != null && thread1.isAlive()) {
            thread1.stopThread();
            try {
                thread1.join();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
 


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



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

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

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


 




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


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

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