`
alartin
  • 浏览: 209592 次
社区版块
存档分类
最新评论

Swing中的并发和多线程

阅读更多
看到很多地方讲述Swing中的并发和多线程问题,感觉讲的都不如Sun的教程,这里复述一下关键。Swing之所以和多线程紧密联系在一起是因为图形界面编程中如果只采取顺序编程(也就是你的代码或任务依次执行),会出现很大的问题,比如你要编写一个FTP客户端,你不能让文件下载的时候,用户界面死在那里,你既不能取消任务也不能和界面交互吧。所以有必要将耗时的任务,比如文件下载放到一个独立的线程中处理,而让用户同时能够干其他事情。简单来说,Swing中有三种线程:
  1. 启动线程或者初始线程: 这个线程负责调用main方法,很多顺序编程一开始就用的是这种线程。在Swing中启动线程负责很少的事务,主要干两件事情,第一件就是创建一个可运行的对象(Runnable Object),这个可运行对象的任务比较重要,它负责初始化图形界面,第二件就是将这个可运行对象安排到另外一个非常重要的线程,事件分派线程中执行。第二件事情是通过SwingUtilies的invokeLater和invokeAndWait方法来实现的。几乎所有的创建Swing组件和与Swing组件交互的代码都要在事件分派线程中执行。
  2. 事件分派线程:在Swing中负责事件处理的代码需要在一个特定的线程中运行,这个线程就是事件分派线程。大部分调用Swing方法的代码也在这个线程中运行。原因是大部分Swing对象中的方法并不是线程安全的,所以需要这个特定的事件分派线程来保证线程安全。当然也有部分swing对象中的方法指明是线程安全的,这些方法可以在任何线程中调用。你可以将事件分派线程中运行的代码想象成一系列短小的任务,大部分任务都是调用事件处理方法,例如ActionListener.actionPerformed()方法,其他任务可被程序代码通过SwingUtilities的invokeLater/invokeAndWait方法来安排。需要注意的是,在事件分派线程中的任务必须短小精悍,这意味着这些任务能够很快执行完毕,如果你发现有一个耗时的任务,那么你肯定出错了,你会发现你的图形界面经常被卡住,或者死掉了。对于耗时任务你需要另外一个线程,例如工作线程(Worker Thread)来处理。判断你的代码时候运行在事件分派线程上的方法很简单,使用javax.swing.SwingUtilities.isEventDispatchThread()方法即可。
  3. 工作线程(Worker Thread)或者后台线程(Background Thread):你可以在这个线程中处理耗时任务。
分享到:
评论

相关推荐

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

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

    java Swing 多线程下载器

    在Java Swing中实现多线程下载,我们需要利用Java的并发特性。多线程允许我们同时处理多个任务,对于下载来说,这意味着我们可以将一个大文件分割成多个小部分,然后在不同的线程中并行下载这些部分。这极大地提高了...

    Swing + Socket + 多线程 至尊QQ 客户端安装包

    【Swing + Socket + 多线程 至尊QQ 客户端安装包】是一个集成Swing图形界面、Socket通信和多线程技术的QQ类聊天应用。Swing是Java提供的一个用于创建桌面应用程序的GUI(图形用户界面)库,它提供了丰富的组件和样式...

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

    在本项目"基于Java Swing的多线程电梯调度模拟"中,我们主要探讨的是如何利用Java的多线程...通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在实际应用中设计和实现复杂的多线程系统。

    JAVA 开发 Swing与多线程

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

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

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

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

    总的来说,"java多线程+Socket+Swing做的局域网聊天程序"是一个综合性的项目,涵盖了Java基础、网络编程以及GUI设计等多个方面,对于学习和理解Java应用开发具有很高的实践价值。通过这样的项目,开发者可以提升对...

    Java+Swing即时聊天系统,客户端和服务端,多线程,socket

    总结起来,Java+Swing即时聊天系统是通过结合Java的Swing库构建用户界面,利用多线程进行并发处理,通过Socket进行网络通信,实现用户间的实时消息传递。这样的系统为学习和理解Java的GUI编程、多线程以及网络编程...

    多线程抢红包带SwingUI

    此外,Swing的Event Dispatch Thread (EDT)机制保证了所有的界面更新都在同一线程中执行,避免了界面卡顿和不一致的现象。 项目的实现可能包括以下几个步骤: 1. 创建Swing UI,包含红包列表展示区、抢红包按钮等...

    基于swing多线程的赛马游戏

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

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

    这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示了多线程技术在游戏和图形用户界面中的应用。 首先,我们需要理解Java中的线程。在Java中,每个运行的程序都至少有一个线程,...

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

    在这个“java多线程聊天室”项目中,开发者使用Swing构建了一个支持多用户交流的界面,同时利用多线程技术来实现并发处理,确保聊天室的稳定和高效。 首先,让我们深入理解Java Swing的基础。Swing提供了丰富的组件...

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

    Swing和多线程下载是Java编程中的两个重要概念,它们在实际开发中有着广泛的应用。Swing是Java提供的一种图形用户界面(GUI)工具包,用于构建桌面应用程序。而多线程则允许程序同时执行多个任务,提高系统效率,...

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

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

    java多线程之赛马程序实验8多线程练习下载进度

    总结来说,这个实验旨在帮助开发者深入理解Java多线程的概念,熟练运用`Thread`类的`run`和`start`方法,以及如何通过进度条来实时展示多线程任务的执行进度。通过实践,开发者可以更好地掌握并发编程的技巧,这对于...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

    java多线程+Socket+Swing局域网聊天软件(客户端源码)

    在这个项目中,开发者利用Java的多线程能力来处理并发用户交互,Socket用于网络通信,而Swing则提供了图形用户界面(GUI)。 首先,我们来看Java的多线程。在多线程环境下,程序可以同时执行多个任务,这对于聊天...

    基于java+socket+swing+多线程聊天室

    综上所述,这个基于Java的聊天室项目利用了Swing来构建用户界面,通过Socket进行网络通信,采用多线程保证程序的并发性和响应性,并通过特定的消息格式实现了私聊功能。开发者可能在"SimpleChatRoom2"中实现了更多的...

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

    在"JAVA SWING 多线程扫描局域网IP及端口 v2 源码"这个项目中,我们可以看到开发者使用了Swing来创建一个图形化的用户界面,同时结合多线程技术来实现局域网内的IP和端口扫描。 1. **Swing基础**:Swing是Java AWT...

    模拟多进程并发

    7. **并发集合**:Java提供了一些并发友好的集合,如ConcurrentHashMap和CopyOnWriteArrayList,它们在多线程环境下提供了更好的性能和安全性。 8. **异常处理**:在并发编程中,正确处理线程异常是至关重要的,...

Global site tag (gtag.js) - Google Analytics