通过运用多线程来异步控制程序的运行

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;

    }

}

  

时间: 2024-08-28 21:12:35

通过运用多线程来异步控制程序的运行的相关文章

Android Learning:多线程与异步消息处理机制

在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客,主要介绍了线程和异步处理机制的意义和用法,目的在于帮助初学者能够加深对异步消息处理机制的理解,在实际Android工程中能够更多地使用AsyncTask工具类在子线程中进行UI更新. 一.Android当中的多线程[1] 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序

一位牛人的多线程和异步调用文章

转自小顾问原文 一位牛人的多线程和异步调用文章 首先申明:这篇文章不是我写的,我看到的一位牛人的,自己慢慢的消化了…… 摘要:本章讨论与智能客户端应用程序中多线程的使用有关的问题.为了最大限度地提高智能客户端应用程序的响应能力,需要仔细考虑如何和何时使用多线程.线程可以大大提高应用程序的可用性和性能,但是当您确定它们将如何与用户界面交互时,需要对其进行非常仔细的考虑. 线程是基本执行单元.单线程执行一系列应用程序指令,并且在应用程序中从头到尾都经由单一的逻辑路径.所有的应用程序都至少有一个线程,

宇哥带你飞之Android多线程与异步任务--第一篇

本人工作已经一年多了,具体点说已经一年多3个月了,实习的早,过早的受到了社会的蹂躏.今年6月多份毕业了,然后就到了一个比较大的公司,具体名字就不说了,就是妹子超级超级多....在学校学的是游戏,cx之类的,但是鬼使神差的毕业后跟着同学就干上了应用,多亏了我的第一个老板--李金波,超级感谢~ 好了,废话不多说了,接下来就开启Android多线程与异步任务的学习吧,由于内容有点多,分几篇博客来和大家扯淡~ 学习Android当然就避免不了学习java,java中也有多线程还有线程之间的同步问题等等~

NET中的并行编程(TPL)——多线程、异步、任务和并行计算

https://masuit.com/1201 谈一谈.NET中的并行编程(TPL)——多线程.异步.任务和并行计算 懒得勤快 发表于2018-04-26 19:41:00 | 最后修改于2018-06-27 23:44:40 .NET 多线程 异步 高并发 分类:.NET开发技术 | 评论总数:0条 | 热度:2243℃ 我要编辑 写在前面: 在做了几个月的高并发项目的过程中,其实发现自己真的提升了不少,所以也想把这段时间的收获分享给大家,然后写这篇文章发现,写下来是一发不可收拾,所以这篇文章

初步谈谈 C# 多线程、异步编程与并发服务器

多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维符合正常人的思维习惯,线程中的处理程序依然是顺序执行,所以编程起来比较方便,但是缺点也是明显的,多线程的使用会造成多线程之间的上下文切换带来系统花销,并且共享变量之间也是会造成死锁的问题. 3.因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变

异步执行的运行机制

异步执行的运行机制如下.(同步执行也是如此,因为它可以被视为没有异步任务的异步执行.) (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack). (2)主线程之外,还存在一个"任务队列"(task queue).只要异步任务有了运行结果,就在"任务队列"之中放置一个事件. (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件.那些对应的异步任务

java中多线程的基本理解以及运行机制

所谓线程,就是一种简单的进程,多线程可以实现多个运行,这样就丰富我我们的功能. 线程有以下几个状态: 可运行状态,运行状态,阻塞状态,销毁状态. 运行线程一般有两种方式,一种是继承thread类重写run方法.第二种是写Runnable然后重写run方法实现线程. 下面是分别两类方法: 1: package Test; public class dxcheng { /** * @param args */ public static void main(String[] args) { // T

第一章 管理程序流 之 实现多线程和异步处理

1. 概述 本章主要讲解.net4.5如何实现多线程和异步处理的相关内容. 2. 主要内容 2.1 理解线程 ① 使用Thread类   public static class Program   {       public static void ThreadMethod()       {           for (int i = 0; i < 10; i++)           {               Console.WriteLine(“ThreadProc: {0}”,

C#多线程与异步

多线程与异步编程,一直是小白变成(●—●)的一个坎.平时也用到过不少多线程与异步操作,在这里进行一下记录. 异步与多线程的概念 平时可能会遇见需要爬网页数据,这个时候如果数据很庞大.那么单线程会造成等待.如果这个时候使用Thread开一个线程,经管会避免UI线程卡顿,但是依然会很慢.这就是典型的多线程错误使用情况. 那么针对此情景,需要进行如何处理呢?首先要理解一下,网页数据的操作,IO操作. IO操作:IO流实际上是一种无结构的字节序或字符序列,进行插入和移除就是IO操作.均是以IO流为基础,