`
laiseeme
  • 浏览: 124695 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
社区版块
存档分类
最新评论

swing与并发【工作线程】【拥有临时结果的任务】

阅读更多
就是工作线程在后台运行到半拉,给出一个临时数据信息,也就是说临时的结果


方法就是在工作线程中使用publish()方法将中间数据存入其中,再覆盖process方法,存入的中间数据将被他调到事件分派线程来
//这段代码主要是为读者展示如何处理正在运行的程序的中间结果
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.SwingUtilities;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
public class threadtest 
{
	static final int WIDTH=600;
	static final int HEIGHT=800;
	JFrame frame;
	JPanel pane;
	static JTextField text1;
	private worker wor1;
	private worker wor2;
	public void add(Component c,GridBagConstraints constraints,int x,int y,int w,int h)
    {
        constraints.gridx=x;
        constraints.gridy=y;
        constraints.gridwidth=w;
        constraints.gridheight=h;
        pane.add(c,constraints);
    }
	public threadtest()
	{
		frame=new JFrame("中间结果任务测试");
		pane=new JPanel();
		frame.setContentPane(pane);
		Toolkit kit=Toolkit.getDefaultToolkit();
		Dimension screenSize=kit.getScreenSize();
		int width=screenSize.width;
		int height=screenSize.height;
		int x=(width-WIDTH)/2;
		int y=(height-HEIGHT)/2;
		frame.setSize(WIDTH,HEIGHT);
		frame.setLocation(x,y);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.pack();
		GridBagLayout layout=new GridBagLayout();
        pane.setLayout(layout);
        GridBagConstraints  constraints=new GridBagConstraints();
        constraints.fill=GridBagConstraints.NONE;
        constraints.anchor=GridBagConstraints.EAST;
        constraints.weightx=4;
        constraints.weighty=3; 
        JButton button1=new JButton("运行后台计数器一");
        JButton button2=new JButton("运行后台计数器二");
        JButton button3=new JButton("临时结果操作一");
        JButton button4=new JButton("临时结果操作二");
        text1=new JTextField(10);
        add(button1,constraints,1,0,1,1);
        add(button3,constraints,0,1,1,1);
        add(text1,constraints,2,1,1,1);
        add(button2,constraints,1,2,1,1);
        add(button4,constraints,0,3,1,1);
	button1.addActionListener
	(//将计数工作放入工作线程,然后执行它
new ActionListener()
    {
        public void actionPerformed(ActionEvent e) 
        {
        	(wor1 = new worker()).execute();
        }
    }
	);

    button2.addActionListener
    (//将计数工作放入工作线程,然后执行它
    new ActionListener()
    {
        public void actionPerformed(ActionEvent Event) 
        {
        	(wor2 = new worker()).execute();
        }	
    } 
    );

    button3.addActionListener
    (//当单击此按钮时,后台计数会停止,并且会将目前的数据显示在文本组件中。
    new ActionListener()
    {
    	public void actionPerformed(ActionEvent Event) 
        {
    		wor1.cancel(true);
			wor1 = null;		
    		
        }	
    }
    );

    button4.addActionListener
    (//当单击此按钮时,后台计数会停止,并且会将目前的数据显示在文本组件中。
    new ActionListener()
    {
        public void actionPerformed(ActionEvent Event) 
        {
        	wor2.cancel(true);
			wor2 = null;		
        }	
    }
    );
	}

	private static class counter 
	{//创建一个内部类,使用其构造器赋值
		private final int sum;

		counter(int sum) 
		{
			this.sum=sum;
		}
	}

	private class worker extends SwingWorker<Void, counter> 
	{//创建一个worker类,这个类继承SwingWorker类,所以要实现doInBackground()和process()方法。这个方法主要是实现一个计数功能
		protected Void doInBackground() 
		{
			int sum = 0;
			while (!isCancelled()) 
			{
				sum++;
			}
			publish(new counter(sum)); //使用publish()方法将中间数据储存起来
			return null;
		}
		protected void process(List<counter> count) 
		{//这个方法主要是将中间数据从publish()方法中提取出来,在放入到事件分发线程中去显示
			counter cou = count.get(count.size() - 1);
			text1.setText(String.format("%d", cou.sum));
		}
	}
	public static void main(String[] args)
	{
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new threadtest();
			}
		});
	}
	
}
分享到:
评论

相关推荐

    JAVA 开发 Swing与多线程

    在Java开发中,Swing库是用来构建图形用户界面(GUI)的工具包,而多线程则是提升程序并发性能和响应能力的关键技术。Swing虽然是Java语言的一部分,但它设计为单线程模型,主要是为了简化GUI编程并避免复杂的同步...

    java Swing 多线程下载器

    Java Swing多线程下载器是一种利用Java Swing库构建的图形用户界面(GUI)应用程序,它具备多线程下载功能,并支持断点续传。这样的工具类似于我们熟知的迅雷下载管理器,允许用户同时下载多个文件,提高下载速度,...

    java + swing + io + 多线程 +聊天室

    在Java编程领域,Swing、IO(输入/输出)和多线程是构建复杂应用程序的重要技术,特别是当我们要创建一个局域网内的多人聊天室时。这个项目将这些技术巧妙地融合在一起,为学习者提供了丰富的实践机会。下面将详细...

    基于java swing的多线程电梯调度模拟

    在本项目"基于Java Swing的多线程电梯调度模拟"中,我们主要探讨的是如何利用Java的多线程特性来实现一个复杂的系统——电梯调度。这个任务是在操作系统课程中的一个典型作业,它要求开发者模拟真实世界中的电梯运行...

    Java Swing 赛马 小游戏 线程 实例

    在Java中,线程是并发执行的代码段,它可以与程序的其他部分同时运行。在赛马游戏中,每个赛马可以被看作是一个独立的线程,它们在后台并行运行,模拟马匹的移动。这样做的好处是,即使赛马在移动,用户界面仍然能够...

    java多线程+Socket+Swing做的局域网聊天程序

    在Java中,多线程是并发执行多个任务的能力。在聊天程序中,多线程至关重要。服务端可能需要同时处理来自多个客户端的连接请求,因此需要创建多个线程来独立处理每个连接。客户端也需要开启独立线程来接收服务器的...

    java 抽奖系统 swing界面,多线程

    Java 抽奖系统是基于Swing图形用户界面(GUI)设计的一个应用程序,它利用多线程技术实现流畅的用户体验,并且可能涉及到数据流处理。这个系统对于初学者来说,是一个很好的学习项目,因为它涵盖了Java编程中的多个...

    swing 线程 实现奖项抽取

    这是Java中的多线程技术应用,可以避免因为计算密集型任务导致用户界面无响应。 线程的创建和管理在Java中通常是通过`Thread`类或者`ExecutorService`实现。在这个抽奖项目中,可能会使用`SwingWorker`,它是Swing...

    单任务多线程下载程序

    多线程允许同时执行多个任务,提高程序的并发性能。在下载程序中,多线程可以将大文件分割成多个部分并行下载,从而显著提高下载速度。 1. **创建多线程** - 实现`Runnable`接口:创建一个新的类实现`Runnable`...

    基于swing多线程的赛马游戏

    本项目“基于Swing多线程的赛马游戏”是一个很好的实践案例,它结合了Swing图形用户界面(GUI)和多线程技术,以模拟赛马比赛并允许用户下注和预测结果。 首先,我们要理解Swing的基础。Swing是Java的一个图形用户...

    JAVA+多线程+swing和awt技术+ 飞机大战+学习Java者

    标题中的“JAVA+多线程+swing和awt技术+ 飞机大战+学习Java者”揭示了这个压缩包包含的内容是关于Java编程的,特别是涉及到多线程和图形用户界面(GUI)开发,使用了Java的Swing和AWT库来实现一个“飞机大战”的游戏...

    模拟多进程并发

    9. **性能监控与调优**:开发者需要使用如JVisualVM等工具来监控线程状态,分析CPU和内存使用,以便优化并发程序的性能。 综上所述,这个“模拟多进程并发”的项目不仅涵盖了Java的并发编程,还涉及到了Swing的GUI...

    Swing线程之SwingUtilities.invoke

    Swing线程机制是Swing库中的关键概念,它确保了所有对Swing组件的操作都在正确的线程——事件分发线程(Event Dispatch Thread,简称EDT)上执行,以避免线程安全问题和界面更新不一致的情况。`SwingUtilities....

    swing,线程和网络编程教学示例

    Swing主要用于创建图形用户界面(GUI),线程则是多任务处理的核心,而网络编程则允许程序通过互联网进行通信。让我们深入探讨这三个方面的知识。 **Swing:** Swing是Java AWT(Abstract Window Toolkit)库的...

    一个适合学习Swing和多线程下载的程序

    Swing是线程安全的,这意味着它设计时考虑到了多线程环境,但为了防止UI更新与业务逻辑混淆,通常推荐使用Event Dispatch Thread (EDT) 来处理UI组件的更新。 多线程下载涉及到并发控制和资源管理。在Java中,我们...

    java多线程聊天室(使用swing)

    2. **工作线程**:处理非UI任务,如接收和发送聊天消息。通过使用Thread类或者ExecutorService(例如ThreadPoolExecutor)创建新线程,可以避免阻塞EDT,使得界面保持响应。 项目的结构可能包括以下几个部分: - *...

    多线程抢红包带SwingUI

    在IT领域,多线程和线程间通信是并发编程中的重要概念,它们在提高程序效率、优化资源利用等方面发挥着关键作用。本项目“多线程抢红包带SwingUI”就是一个很好的实践示例,它结合了Java的Swing库来创建图形用户界面...

    Swing中的线程研究.pdf

    Swing 是Java GUI库的一部分,主要用于构建桌面应用。在Swing中,线程管理是非常关键的概念,因为它涉及到用户界面...在多线程编程中,应始终确保在合适的线程中执行相应的工作,以提高用户体验并避免潜在的并发问题。

    再论JavaSwing线程.pdf

    Swing API设计为单线程模型,这意味着所有对Swing组件的修改和操作必须在同一个线程中完成,即Swing线程(AWT事件分派线程)。这种设计旨在减少线程同步的复杂性,但同时也引入了挑战,因为不当的线程使用可能导致...

    简单多线程多任务的学习

    为了实现进度条,你需要定义一个计数器或者进度变量,每当工作线程完成一部分任务时,就更新这个变量。然后,通过事件调度器将更新进度条的请求添加到主线程的任务队列中。这样,当主线程空闲时,它会执行这个更新...

Global site tag (gtag.js) - Google Analytics