通过运用多线程来异步控制程序的运行
background:
又一个持续运行的程序,不断产生数据,而在主程序中不仅需要监控所产生的程序,同时还要能控制其运行状态。
solution:
不断产生数据的为一个线程,为达到需求,增加两个线程,其中辅线程用来不断监视产生数据线程的数据,而主线程则用来控制辅线程的运行与否(即是否监视)。
一共涉及三个类,主控制类JController、辅线程Producer、数据线程Counter.代码如下所示:
1.JController
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 |
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt. event .ActionEvent; import java.awt. event .ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JSplitPane; import javax.swing.JToolBar; public
class JController extends JFrame{ Counter count = new
Counter(); Producer produce = new
Producer(count); public
JController() { super(); setTitle( "JFileChooserTest" ); setBounds(100,100,350,150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JButton button = new
JButton(); JButton button2 = new
JButton( "button2" ); count.start(); final JLabel label = new
JLabel(); button.addActionListener( new
ActionListener(){ //监听事件 public
void actionPerformed(ActionEvent e){ boolean isAlive = produce.isAlive(); if (isAlive){ } else { produce = new
Producer(count); produce.start(); } } }); button2.addActionListener( new
ActionListener(){ //监听事件 public
void actionPerformed(ActionEvent e){ produce.stopRunning(); } }); getContentPane().add(button,BorderLayout.NORTH); //布局处理 getContentPane().add(button2,BorderLayout.CENTER); button.setText( "button1" ); } /** * @param args */ public
static void main(String[] args) { // TODO Auto-generated method stub JController jFileChooserTest = new
JController(); jFileChooserTest.setVisible( true ); } } |
2.Producer
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 |
public
class Producer extends Thread{ volatile
boolean stopRequest = false ; Counter count = new
Counter(); public
Producer(Counter count){ this .count = count; } @Override public
void run(){ while (!stopRequest){ try
{ Thread.sleep(800); } catch
(InterruptedException e) { // TODO Auto-generated catch block System. out .println(e.toString()); } System. out .println(count.getCount()); } } public
void stopRunning(){ stopRequest = true ; } public
static void main(String[] args){ } } |
3.Counter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
import java.io.IOException; public
class Counter extends Thread{ volatile
int count =0; public
static void main(String[] args) throws Exception{ // TODO Auto-generated method stub } public
void run(){ while ( true ){ try
{ Thread.sleep(830); } catch
(InterruptedException e) { // TODO Auto-generated catch block System. out .println(e.toString()); } count++; } } public
int getCount(){ return
count; } } |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。