Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Java
Перезагрузить страницу Правильный способ убийства threadов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Oxlamon Oxlamon вне форума
Member
 
Сообщений: 33
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.04.2012
По умолчанию Правильный способ убийства threadов - 28.04.2015, 20:17

Здравствуйте.
Разбираюсь с работой Thread и для затравки решил сделать простенькое приложение:
3 прогресс-бара, рядом с каждым по 2 кнопки (пуск и стоп). После нажатия соответсвующей кнопки прогресс-бар начинает наполняться до 100, потом сбрасывается, наполняется дальше и т.д. При этом при нажатии пуска порождается Thread для соответствующего прогрес-бара, а при нажатии стоп этот Thread должен умирать.

Результат примерно такой:
Java Код:
// mFrame.java
package multithreading;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.EmptyBorder;

public class mFrame extends JFrame {

    private JPanel contentPane;
    JProgressBar progressBar1;
    JProgressBar progressBar2;
    JProgressBar progressBar3;
    JButton btnStop1;
    JButton btnStop2;
    JButton btnStop3;
    JButton btnStart1;
    JButton btnStart2;
    JButton btnStart3;
   
    threadClass t1, t2, t3;

    /**
     * Launch the application.
     */

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mFrame frame = new mFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public mFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
       
        btnStop1 = new JButton("Stop");
        btnStop1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                if(t1 == null)
                    return;
                if(t1.alive)
                {
                    t1.stopThread();
                    t1 = null;
                }
            }
        });
        btnStop1.setBounds(335, 11, 89, 23);
        contentPane.add(btnStop1);
       
        btnStart1 = new JButton("Start");
        btnStart1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(t1 == null)
                    t1 = new threadClass("Thread 1", progressBar1);
                if(!t1.alive)
                    t1.start();
            }
        });
        btnStart1.setBounds(236, 11, 89, 23);
        contentPane.add(btnStart1);
       
        btnStart2 = new JButton("Start");
        btnStart2.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(t2 == null)
                    t2 = new threadClass("Thread 2", progressBar2);
                if(!t2.alive)
                    t2.start();
            }
        });
        btnStart2.setBounds(236, 45, 89, 23);
        contentPane.add(btnStart2);
       
        btnStop2 = new JButton("Stop");
        btnStop2.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(t2 == null)
                    return;
                if(t2.alive)
                {
                    t2.stopThread();
                    t2 = null;
                }
            }
        });
        btnStop2.setBounds(335, 45, 89, 23);
        contentPane.add(btnStop2);
       
        btnStart3 = new JButton("Start");
        btnStart3.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(t3 == null)
                    t3 = new threadClass("Thread 3", progressBar3);
                if(!t3.alive)
                    t3.start();
            }
        });
        btnStart3.setBounds(236, 79, 89, 23);
        contentPane.add(btnStart3);
       
        btnStop3 = new JButton("Stop");
        btnStop3.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(t3 == null)
                    return;
                if(t3.alive)
                {
                    t3.stopThread();
                    t3 = null;
                }
            }
        });
        btnStop3.setBounds(335, 79, 89, 23);
        contentPane.add(btnStop3);
       
        progressBar3 = new JProgressBar();
        progressBar3.setBounds(10, 79, 216, 23);
        contentPane.add(progressBar3);
       
        progressBar2 = new JProgressBar();
        progressBar2.setBounds(10, 45, 216, 23);
        contentPane.add(progressBar2);
       
        progressBar1 = new JProgressBar();
        progressBar1.setBounds(10, 11, 216, 23);
        contentPane.add(progressBar1);
    }
}

// =======================================
// threadClass.java

package multithreading;

import javax.swing.JProgressBar;

public class threadClass implements Runnable
{
    static int value = 0;
    Thread t;
    String threadName = "";
    JProgressBar bar;
    boolean alive = false;
   
    threadClass(String name, JProgressBar bar)
    {
        this.threadName = name;
        System.out.println("Creating thread " + threadName);
        this.bar = bar;
    }
   
    public void run()
    {
        try
        {
            for(int i = 0; ; i++)
            {
                if(i > 100) i-= 100;
                bar.setValue(i);
                Thread.sleep(50);
                if(!alive)
                    return;
            }
        }
        catch(Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }

    public void start()
    {
        System.out.println("Starting thread " + threadName);
        if(t == null)
        {
            t = new Thread(this, threadName);
            alive = true;
            t.start();
        }
    }
   
    public void stopThread()
    {
        if(t.isAlive())
        {
            try
            {
                alive = false;
                bar.setValue(0);
            }
            catch(Exception ex)
            {
                System.out.println(ex.getMessage());               
            }
        }
    }
}

Меня терзают определённые сомнения относительно того, правильно ли я "убиваю" треды, не загаживают ли они память. Если это так, то как правильно нужно убивать треды?
Ответить с цитированием
Ads
Ответ

Метки
java , multithreading , thread

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sony Vegas Pro 9.0 Правильный рендеринг. Retius Любые вопросы от новичков 3 16.03.2015 21:36
Подсчет правильный и не правильных ответов Наталья_Ким Visual Basic 1 12.01.2014 20:35
Консоль Xbox 360 стала орудием убийства Dark King Новости 0 08.04.2013 21:32
Правильный обжим витой пары wildtaboo Любые вопросы от новичков 1 24.01.2012 12:20
помогите сделать правильный выбор Razmes Любые вопросы от новичков 14 06.02.2011 16:33
Не отображается правильный объем памяти. Raphus Техническая поддержка 16 23.04.2007 22:13
Interbase. как составить правильный запрос Aisha Другие СУБД 0 01.12.2006 14:02
Не получается правильный разрыв соединения Palmman Сетевое программирование 5 16.10.2006 11:54
Как составить правильный алгоритм рак-щука imported_ork Алгоритмы 1 22.11.2005 18:57
Какой существует способ способ вывода на печать текста и изображений ИА C++ Builder 1 28.07.2004 03:41
Как узнать правильный объем передаваемых данных rarelang С/С++ 0 08.05.2004 02:37
Кк получить правильный результат времени etc С/С++ 5 10.04.2004 17:00



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов