Java线程模型如何完善相关的数据处理

开发 后端
Java线程模型只有在不断的学习中才能更好的掌握相关问题的解决方案。下面我们就详细的来看看如何才能更好的掌握相关的方案。

Java线程模型在使用耳朵时候需要大家不断的进行学习,下面我们就看看如何才能更好的掌握相关的技术语言,判断是抢占式还是协作式的Java线程模型,取决于虚拟机的实现者,并根据各种实现而不同。因此,Java开发员必须编写那些能够在两种模型上工作的程序。

正如前面所提到的,在抢占式模型中线程可以在代码的任何一个部分的中间被打断,除非那是一个原子操作代码块。原子操作代码块中的代码段一旦开始执行,就要在该线程被换出处理器之前执行完毕。在 Java 编程中,分配一个小于32位的变量空间是一种原子操作,而此外象double和long这两个64位数据类型的分配就不是原子的。使用锁来正确同步共享资源的访问,就足以保证一个多线程程序在抢占式模型下正确工作。#t#

而在协作式模型中,是否能保证线程正常放弃处理器,不掠夺其他线程的执行时间,则完全取决于程序员。调用yield()方法能够将当前的线程从处理器中移出到准备就绪队列中。另一个方法则是调用sleep() 方法,使Java线程模型放弃处理器,并且在 sleep 方法中指定的时间间隔内睡眠。

正如你所想的那样,将这些方法随意放在代码的某个地方,并不能够保证正常工作。如果线程正拥有一个锁(因为它在一个同步方法或代码块中),则当它调用yield()时不能够释放这个锁。这就意味着即使这个Java线程模型已经被挂起,等待这个锁释放的其他线程依然不能继续运行。为了缓解这个问题,最好不在同步方法中调用yield方法。将那些需要同步的代码包在一个同步块中,里面不含有非同步的方法,并且在这些同步代码块之外才调用yield。

另外一个解决方法则是调用wait()方法,使处理器放弃它当前拥有的对象的锁。如果对象在方法级别上使同步的,这种方法能够很好的工作。因为它仅仅使用了一个锁。如果它使用fine-grained锁,则wait() 将无法放弃这些锁。此外,一个因为调用wait()方法而阻塞的线程,只有当其他线程调用notifyAll()时才会被唤醒。

Java线程模型模型和 AWT/Swing

在那些使用Swing 和/或AWT包创建GUI(用户图形界面)的Java程序中,AWT事件句柄在它自己的线程中运行。开发员必须注意避免将这些GUI线程与较耗时间的计算工作绑在一起,因为这些线程必须负责处理用户时间并重绘用户图形界面。换句话来说,一旦GUI线程处于繁忙,整个程序看起来就象无响应状态。Swing线程通过调用合适方法,通知那些Swing callback(例如 Mouse Listener 和 Action Listener )。这种方法意味着listener无论要做多少事情,都应当利用listener callback方法产生其他线程来完成此项工作。目的便在于让listener callback更快速返回,从而允许Swing线程响应其他事件。

如果一个Swing线程不能够同步运行、响应事件并重绘输出,那怎么能够让其他的线程安全地修改 Swing的状态?正如上面提到的,Swing callback在Swing 线程中运行。因此他们能修改Swing数据并绘到屏幕上。

但是如果不是Swing callback产生的变化该怎么办呢?使用一个非Swing线程来修改Swing数据是不安全的。Swing提供了两个方法来解决这个问题:invokeLater()和invokeAndWait()。为了修改Swing状态,只要简单地调用其中一个方法,让Runnable的对象来做这些工作。因为Runnable对象通常就是它们自身的线程,你可能会认为这些对象会作为线程来执行。但那样做其实也是不安全的。事实上,Swing会将这些对象放到队列中,并在将来某个时刻执行它的run方法。这样才能够安全修改Swing状态。

Java 语言的设计,使得多线程对几乎所有的Applet都是必要的。特别是,IO和GUI编程都需要多线程来为用户提供完美的体验。如果依照本文所提到的若干基本规则,并在开始编程前仔细设计系统——包括它对共享资源的访问等,你就可以避免许多常见和难以发觉的Java线程模型陷阱。

 

责任编辑:张浩 来源: 博客园
相关推荐

2009-12-25 15:58:37

WPF数据处理

2024-02-07 09:25:52

数据处理快手大模型

2023-11-29 13:56:00

数据技巧

2009-07-15 18:06:38

Swing线程

2017-07-21 14:22:17

大数据大数据平台数据处理

2023-07-31 08:21:22

语法校对器Pick

2013-12-16 17:17:01

OpenMp数据处理

2023-10-05 12:43:48

数据处理

2019-01-25 13:22:50

RocketMQ数据处理

2024-01-31 23:22:35

vaexPython

2024-04-01 10:07:47

应用程序数据数据库

2016-12-13 11:48:05

数据处理不平衡数据

2018-12-07 14:50:35

大数据数据采集数据库

2020-11-02 15:56:04

大数据数据库技术

2015-06-16 16:49:25

AWSKinesis实时数据处理

2023-09-27 15:34:48

数据编程

2018-08-14 11:05:25

2010-04-12 11:12:53

Oracle数据处理

2014-06-05 09:29:03

数据处理

2010-03-16 18:40:59

Java多线程编程
点赞
收藏

51CTO技术栈公众号