Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
32 / 32 / 22
Регистрация: 29.10.2015
Сообщений: 195
1

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались

02.03.2016, 19:53. Показов 974. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200);
По нажатию на кнопку из другого потока, нужно чтобы эти 2 потока останавливались. У меня всё время вылетает исключение. Как можно исправить такое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2016, 19:53
Ответы с готовыми решениями:

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например,...

Вызывть метод одного потока из другого потока
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1),...

Управление объектами потока из другого потока
Доброго времени. Есть два потока, один GUI, второй рабочий - делает снапшоты открытых окон,...

Как сделать чтобы по нажатию на кнопку чтобы выводилась буква и тд? в этом совсем не шарю а нужно сделать клавиатуру
Вообще 1 день работаю с делфи а завтра сдавать практику, хелп ми)

3
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
02.03.2016, 19:56 2
без кода и сообщения об ошибке надо форум телепатов
0
32 / 32 / 22
Регистрация: 29.10.2015
Сообщений: 195
02.03.2016, 20:55  [ТС] 3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
 
public class Task {
    public static void main(String[] args) {
        Frame frame = new Frame("JAVA");
    }
}
 
class Frame extends JFrame {
    public static final int WIDTH = 900;
    public static final int HEIGHT = 400;
 
    private int x = 100;
    private int y = 100;
 
    public Frame(String s) {
        setTitle(s);
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MyPanel panel = new MyPanel();
        add(panel);
        setVisible(true);
    }
 
    class MyPanel extends JPanel {
        private JLabel info;
        private JTextField set;
        private JButton ok;
        private JButton start;
        private JLabel obecnieFps;
        private JLabel intFps;
        private Thread Anim;
        private Thread TFps;
        private int fps;
        private boolean enable = false;
        private boolean up = true;
 
        public MyPanel() {
            info = new JLabel("Введи кол-во фпс: ");
            set = new JTextField(10);
            ok = new JButton("Изменить");
            start = new JButton("Старт");
            obecnieFps = new JLabel("Текущий ФПС: ");
            intFps = new JLabel("");
            Anim = new Thread(new AnimThread());
            TFps = new Thread(new TThread());
 
            ok.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        fps = Integer.parseInt(set.getText());
                        intFps.setText("" + fps);
                        set.setText("");
                    } catch(Exception ex) {
                        System.out.println("Listener error");
                    }
                }
            });
 
            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        if(!enable) {
                            System.out.println("Меняем текст");
                            start.setText("Остановить");
                            System.out.println("Переменная true");
                            enable = true;
                            System.out.println("Запускаем ANIM");
                            Anim.start();
                            System.out.println("Запускаем TFPS");
                            TFps.start();
                        } else {
                            System.out.println("Меняем тескт 2");
                            start.setText("Старт");
                            System.out.println("Переменная false");
                            enable = false;
                            System.out.println("Ждём Anim");
                            Anim.interrupt();
                            System.out.println("Ждём TFPS");
                            TFps.interrupt();
                        }
                    } catch(Exception ex) {
                        System.out.println("Start error");
                    }
                }
            });
 
            add(info);
            add(set);
            add(ok);
            add(obecnieFps);
            add(intFps);
            add(start);
        }
 
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
 
            Rectangle2D rect = new Rectangle2D.Double((getWidth() - x) / 2 , (getHeight() - y) / 2, x, y);
 
            g2.fill(rect);
        }
 
        class AnimThread implements Runnable {
            @Override
            public void run() {
                try {
                    while (enable) {
                        if (x >= 400) {
                            up = false;
                        }
                        if (x < 100) {
                            up = true;
                        }
                        if (up) {
                            x++;
                            y++;
                        }
                        if (!up) {
                            x--;
                            y--;
                        }
                        Thread.sleep(1000 / 60);
                    }
                } catch(Exception ex) {
                    System.out.println("Anim Thread error");
                }
            }
        }
 
        class TThread implements Runnable {
            @Override
            public void run() {
                try {
                    while (enable) {
                        repaint();
                        Thread.sleep(1000 / 60);
                    }
                } catch(Exception ex) {
                    System.out.println("TThread error");
                }
            }
        }
    }
}
//Старт
Меняем текст
Переменная true
Запускаем ANIM
Запускаем TFPS
//Стоп
Меняем тескт 2
Переменная false
Ждём Anim
Ждём TFPS
Anim Thread error
TThread error
//Старт
Меняем текст
Переменная true
Запускаем ANIM
Start error

Добавлено через 55 минут
Поменял на таймеры. Можно закрывать, работает
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.03.2016, 13:45 4
Цитата Сообщение от liptonus777 Посмотреть сообщение
У меня всё время вылетает исключение. Как можно исправить такое?
Так оно и должно вылетать - InterruptedException. Оно специально задумывалось для вашего случае. Ловите его и обрабатываете.

Добавлено через 49 секунд
PS. Таймеры вроде лучше подходят для вашей задачи
0
03.03.2016, 13:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2016, 13:45
Помогаю со студенческими работами здесь

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

Остановка потока по нажатию клавиши
Проблема такая: я создал 2 потока, в одном работает счетчик, в другом выводит значение. Нужно по...

Нужно записать файл в поток так, чтобы файл из потока можно было передать по TCP
Нужно записать файл в поток так, чтобы файл из потока можно было передать по TCP и открыть на...

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и Qlabel class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru