`
云上太阳
  • 浏览: 131316 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Swing多线程编程

阅读更多

    基本上所有GUI库都是单线程的,Swing就是一种GUI库。什么意思呢?就是说所有对UI的更新都是在主线程中进行,这也是Swing的EDT线程(事件派发线程)也被叫UI线程的原因。如果在UI线程中执行比较耗时的操作,界面会卡住。Swing有个单线程规范,只要牢记会避免很多大坑:所有界面操作的更新都应该在EDT线程执行,所有耗时的操作都应该在单独线程中执行。

     请牢记上面的红字部分,然后我们开始一个实例:点击按钮后,按钮显示秒数,每过一秒显示加1。下面是第一个版本

package com.albert.frame;

import java.awt.BorderLayout;

public class TestSwing extends JFrame {
	private JPanel contentPane;

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

	public TestSwing() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		final JButton button = new JButton("点击");
		contentPane.add(button, BorderLayout.CENTER);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
an				for(int i=0;i<=5;i++){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					button.setText(i+"");
				}
			}
		});
	}

}

 运行代码点击按钮后,会发现界面卡住了,然后过了5秒后,按钮上直接显示了5。而不是我们期望的从0开始每隔一秒加1。

 

      这是上面原因呢?很明显这个违背了上面的原则:不能在EDT线程中进行耗时操作。因为你的耗时操作占用了EDT线程,然后界面更新会去耗时操作后面排队,最后同一个组件的界面更新会合并成最后一个也就是直接显示5。需要说明的是Swing组件的各种事件监听方法都是在EDT线程调用的,比如单击事件。

 

      既然程序并没有按照我们的想法执行,是因为违背了GUI单线程的原则,那我们再次修改下程序,把耗时操作的代码加入到单独的线程中,只贴出修改的部分

button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new Thread(new Runnable() {
					public void run() {
						for(int i=0;i<=5;i++){
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
							button.setText(i+"");
						}
					}
				}).start();
			}
		});
}

 

 

运行程序并且点击按钮,发现程序按照我们的期望执行了。是不是很开心啊,可是不要高兴的太早,虽然功能实现了,但是还是违背了GUI单线程原则:在EDT线程中进行界面的更新。而我们在单独线程中运行了这段界面更新操作的代码:button.setText(i+"")。

       简直头大,button.setText()和我们的耗时操作是一个代码块怎么能分开在两个线程执行啊?日了狗日了!!其实Swing给我们提供了一个工具类SwingUtilities,里面有个方法invokeLater(Runnable runnable),这个方法的作用就是把一个runnable(就是一个任务,很多初学者学习线程认为Runnable也是线程的一部分,其实Runnable只是一个有一个run方法声明的接口)传到EDT线程中,让EDT线程去执行。再次修改代码

button.addActionListener(new ActionListener() {
			int i;
			public void actionPerformed(ActionEvent e) {
				new Thread(new Runnable() {
					public void run() {
						for(i=0;i<5;i++){
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
							SwingUtilities.invokeLater(new Runnable() {
								public void run() {
									button.setText(i+"");
								}
							});
						}
					}
				}).start();
			}
		});
	}

 程序执行的结果也就是我们期望的,并且也符合了GUI单线程的原则,皆大欢喜了。

 然后介绍下Swing提供给我们类SwingWorker,在doInbackground()中执行耗时操作,然后返回结果,可以在done()方法中用get()获取到doInbackground()返回的结果进行界面刷新。

SwingWorker worker = new SwingWorker<Integer, Void>() {
				@Override
				protected Integer doInBackground() throws Exception {
					//耗时操作。。。
					
					return 0;
				}
				@Override
				protected void done() {
					super.done();
					//上面的耗时操作完成后把done()交给EDT执行。
				}
			};

 

好了,以上就是Swing的线程说明,希望有帮助

 

0
0
分享到:
评论

相关推荐

    java Swing 多线程下载器

    总的来说,Java Swing多线程下载器结合了Java的GUI编程、多线程技术以及文件操作,为用户提供了一个功能强大的下载工具。开发这样一个程序需要深入理解Java的并发编程和Swing组件的使用,同时也需要对网络通信和文件...

    Java Swing多线程死锁问题解析

    Java Swing多线程死锁问题解析 Java Swing多线程死锁问题解析是...在实际开发中,我们需要遵循Java Swing多线程编程的基本原则,正确地使用多线程技术,避免死锁和其他问题的出现,使我们的程序更加稳定、高速和高效。

    基于swing的多线程聊天室

    【基于Swing的多线程聊天室】是一个...总结,基于Swing的多线程聊天室是一个综合运用了GUI设计、多线程、网络编程以及数据处理等技术的项目。通过这种方式,可以创建出一个高效、响应迅速并且用户体验良好的聊天应用。

    JAVASWING多线程产生随机球

    Java Swing 是Java GUI(图形用户界面)...通过以上知识点的综合运用,"JAVASWING多线程产生随机球"项目实现了交互式的图形展示,展示了Java Swing在GUI编程中的灵活性和多线程技术在实现复杂动画效果时的重要作用。

    基于swing多线程的赛马游戏

    总的来说,“基于Swing多线程的赛马游戏”是一个综合性的项目,它涵盖了Java Swing GUI设计、多线程编程、并发控制、数据结构、用户交互等多个方面。这个案例对于初学者来说是一个绝佳的学习资源,通过实际操作可以...

    JAVA编写的多线程小弹球测试

    在Java编程领域,多线程是一项重要的技术,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟...

    Java Swing制作多行滚动歌词显示控件.doc

    Java Swing 制作多行滚动歌词显示控件 ...Java Swing 制作多行滚动歌词显示控件需要使用到多种技术和组件,包括领域模型、Java Swing 组件、布局管理、事件处理、图形用户界面设计、多线程编程和调试技术等。

    Java多线程编程

    ### Java多线程编程知识点详解 #### 一、线程基础概述 - **定义与特点:** - **线程**是一种比进程更细粒度的执行单元,它允许在一个进程中并发执行多个任务。 - **轻量级进程**:线程有时被称为轻量级进程,...

    JAVA 开发 Swing与多线程

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

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

    总的来说,这个项目涉及到Java多线程编程、GUI设计、对象间的通信以及线程同步等多个核心概念,是学习和实践Java并发编程的好例子。通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在...

    Javaswing多线程.zip

    在这个“Javaswing多线程.zip”项目中,开发者创建了一个包含四个标签(JLabels)的窗口,这些标签会按照一定的时间间隔轮流显示或隐藏,这通常是为了创建某种动画效果或者信息滚动展示。在Swing中,我们通常使用`...

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

    线程是程序执行的独立路径,Java支持多线程编程,这使得程序可以在同一时间执行多个任务。 1. **Thread类与Runnable接口:** 创建线程有两种方式,一是继承Thread类,二是实现Runnable接口。后者更灵活,因为它可以...

    swing界面socket多线程聊天室

    综上所述,这个“swing界面socket多线程聊天室”项目涵盖了Java GUI设计、网络编程、多线程技术、文件传输以及用户管理等多个关键领域,是学习和实践这些技能的好例子。通过分析和实现这样的项目,开发者可以深入...

    JAVA SWING 多线程扫描局域网IP及端口 v2 源码

    Java Swing 是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件...这个源码项目为学习Java Swing、多线程编程、网络扫描等技术提供了一个实用的示例,对于想要深入这些领域的开发者来说,具有很高的参考价值。

    java 多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。 1. **继承Thread类*...

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

    【标题】"java多线程+Socket+Swing做的局域网聊天程序"涉及的核心知识点主要涵盖Java编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...

    JavaSwing多人猜拳

    尽管缺少源代码,我们可以推断出这个JavaSwing应用涉及到的技术和概念,包括图形用户界面设计、事件处理、多线程、网络编程(如果适用)、游戏逻辑实现以及可能的数据持久化。对于想要学习JavaSwing或者想了解如何...

    java多线程编程

    ### Java多线程编程知识点详解 #### 一、线程基础与概念 **1. 进程与线程** 线程是比进程更轻量级的执行单元,它允许在一个进程中并发执行多个任务。进程是资源分配和调度的基本单位,而线程则是CPU调度和分派的...

    多线程抢红包带SwingUI

    本项目“多线程抢红包带SwingUI”就是一个很好的实践示例,它结合了Java的Swing库来创建图形用户界面(GUI),使用户可以直观地体验到多线程编程的效果。 首先,我们要理解什么是多线程。在单线程程序中,所有操作...

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

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

Global site tag (gtag.js) - Google Analytics