Java程序性能之一

Python XML 转 JSON,XML 转字典 今天我们将学习如何在 Python 中将 XML 转换为 JSON 和 XML 转换为字典。我们可以使用 Python 的xmltodict模块来读取 XML 文件并将其转换为字典或 JSON 数据。我们还可以在大型 XML 文件上进行流式处理,并将其转换为字典。在进入编码部分之前,让我们首先了解为什么需要进行 XML 转换。 阅读详情

尽管Java Swing框架的性能在最新的JDK版本中有了很大的改进,由于对Swing的线程概念认识不足,也有可能写出速度很慢的程序,下边介绍一下自己开发Swing Rich Client程序的心得体会,与大家共享:

  1. 要学会使用SwingWorker,当执行查询数据库,连接网络,或长时间的计算,这些代码应该放在doInBackground()方法,而完成这些后需要更新GUI应该把代码放在done()方法。JDK 1.6的swing包中内置有SwingWorker类,如果你还在使用JDK1.5版本,可以从这里下载https://swingworker.dev.java.net/,如果使用更早期的版本,如JDK1.4,可以从这里下载http://java.sun.com/products/jfc/tsc/articles/threads/src/SwingWorker.java,如果你想在JDK1.4或者之前使用和JDK1.6的接口有限兼容的版本,以便以后升级,可以使用我自己修改的一个版本:
    import  javax.swing.SwingUtilities;
    /**
     * Modified this version SwingWorker to use the same 
     * interface with the JDK 1.6 SwingWorker.
     * <p>
     * public construct(); --->  protected doInBackground();
     * finished();  --->  done();
     * start();     --->  execute();
     
    */


    /**
     * This is the 3rd version of SwingWorker (also known as
     * SwingWorker 3), an abstract class that you subclass to
     * perform GUI-related work in a dedicated thread.  For
     * instructions on using this class, see:
     * 
     * 
    http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
     *
     * Note that the API changed slightly in the 3rd version:
     * You must now invoke start() on the SwingWorker after
     * creating it.
     
    */
    public   abstract   class  SwingWorker {
        
    private  Object value;   //  see getValue(), setValue()
         private  Thread thread;

        
    /**  
         * Class to maintain reference to current worker thread
         * under separate synchronization control.
         
    */
        
    private   static   class  ThreadVar {
            
    private  Thread thread;
            ThreadVar(Thread t) { thread 
    =  t; }
            
    synchronized  Thread get() {  return  thread; }
            
    synchronized   void  clear() { thread  =   null ; }
        }

        
    private  ThreadVar threadVar;

        
    /**  
         * Get the value produced by the worker thread, or null if it 
         * hasn't been constructed yet.
         
    */
        
    protected   synchronized  Object getValue() { 
            
    return  value; 
        }

        
    /**  
         * Set the value produced by worker thread 
         
    */
        
    private   synchronized   void  setValue(Object x) { 
            value 
    =  x; 
        }
        
    private  Exception e;
        
    private   synchronized   void  setException(Exception e) {
            
    this .e  =  e;
        }
        
    private   synchronized  Exception getException() {
            
    return  e;
        }
        
    /**  
         * Compute the value to be returned by the <code>get</code> method. 
         
    */
        
    protected   abstract  Object doInBackground()  throws  Exception;

        
    /**
         * Called on the event dispatching thread (not on the worker thread)
         * after the <code>construct</code> method has returned.
         
    */
        
    protected   void  done() {
        }

        
    /**
         * A new method that interrupts the worker thread.  Call this method
         * to force the worker to stop what it's doing.
         
    */
        
    public   void  interrupt() {
            Thread t 
    =  threadVar.get();
            
    if  (t  !=   null ) {
                t.interrupt();
            }
            threadVar.clear();
        }

        
    /**
         * Return the value created by the <code>construct</code> method.  
         * Returns null if either the constructing thread or the current
         * thread was interrupted before a value was produced.
         * 
         * 
    @return  the value created by the <code>construct</code> method
         
    */
        
    public  Object get()  throws  Exception {
            
    while  ( true ) {  
                Thread t 
    =  threadVar.get();
                
    if  (t  ==   null ) {
                    
    if (getException()  !=   null ) {
                        
    throw  getException();
                    }
                    
    return  getValue();
                }
                
    try  {
                    t.join();
                }
                
    catch  (InterruptedException e) {
                    Thread.currentThread().interrupt(); 
    //  propagate
                     return   null ;
                }
            }
        }


        
    /**
         * Start a thread that will call the <code>construct</code> method
         * and then exit.
         
    */
        
    public  SwingWorker() {
            
    final  Runnable doFinished  =   new  Runnable() {
               
    public   void  run() { done(); }
            };

            Runnable doConstruct 
    =   new  Runnable() { 
                
    public   void  run() {
                    
    try  {
                        setValue(doInBackground());
                    } 
    catch (Exception e) {
                        setException(e);
                    }
                    
    finally  {
                        threadVar.clear();
                    }

                    SwingUtilities.invokeLater(doFinished);
                }
            };

            Thread t 
    =   new  Thread(doConstruct);
            t.setPriority(Thread.NORM_PRIORITY 
    -   2 );        
            threadVar 
    =   new  ThreadVar(t);
        }

        
    /**
         * Start the worker thread.
         
    */
        
    public   void  execute() {
            Thread t 
    =  threadVar.get();
            
    if  (t  !=   null ) {
                t.start();
            }
        }
    }
    这个修改的版本可以使用和JDK1.6相同的3个方法,分别是execute(),doInBackground(),done(). 
  2. 避免程序开始就装载太多的类, 在需要时创建类的实例,这样做能够加快程序的启动时间。
  3. 了解不同API的性能, 这些API的性能不是显而易见的,而JavaDoc并没有给出明确地说明,下边有几个例子,这些方法调用非常慢,有的甚至需要查询网络:
    1. GraphicsDevice.getDisplayModes()方法,如果使用Java写2D游戏,应该注意这个方法,最好不要先调用这个方法,如果你想做全屏游戏,可以先设置默认的屏幕显示模式,例如:new DisplayMode(800, 600, 32, 60),在catch(IllegalArgumentException)后从GraphicsDevice.getDisplayModes()方法查询适合你的游戏的显示模式,再进行设置。
    2.   GraphicsEnvironment。getAllFonts() 方法和GraphicsEnvironment.getAvailableFontFamilyNames()方法,这两个方法因为要读字体文件夹,所以耗时很长,影响性能,一般可以通过后台线程调用这些方法后,更新界面。
    3. PrinterJob.getPrinterJob()和PrinterJob.defaultPage()方法,这两个方法在设置有网络打印机的电脑运行非常慢,因为需要查找网络打印机,而getPrinterJob() 方法更极端,每次调用时都要重新查找网络打印机,所以最好调用一次之后缓存getPrinterJob() 的引用。
    4. 如果您发现有什么API影响性能,希望能和您共同讨论。
使用GEOquery包下载原始数据 阅读详情

相关推荐

Java 实现预览与打印功能详解:打印技术的那些事儿

哈喽,Java 开发小伙伴们!有没有遇到过这样的场景:客户要求一个直接打印功能,并希望在打印之前能够预览,看一下打印的效果?这听起来像一个“复杂又冷门”的需求对吧?但实际上,Java 提供了非常强大的打印 API,不仅可以满足各种打印需求,还可以定制页面格式,插入图片、表格等等!今天我们就来拆解一下,如何用 Java 实现打印预览和打印功能,不仅让打印功能更友好,还能展示打印技术的灵活性和强大。在 Java 中,打印功能主要依赖包。该包提供了与打印相关的一些关键类,比如PrinterJob和。

喵手的博客 1420

PDFBox 打印带背景的文件速度慢

打印慢的原因 java的RasterPrinterJob会执行很多次printPage方法 他应该是按块填充的, 如果页面元素非常复杂, 那么printPage方法可能会执行十次. 而如果你用了如下代码中流式打印的方式, 每页pdf单独实现Printable接口, 重写print方法. 1 private static class FinePrintableDemo i...

weixin_30551963的博客 581

vmware虚拟机安装银河麒麟高级服务器操作系统V10.pdf

vmware虚拟机安装银河麒麟高级服务器操作系统V10.pdf

Java Swing 是否适合做大型项目及桌面应用?

作者:sailing8036链接:https://www.zhihu.com/question/19608871/answer/12378179来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作为一个和Swing深度打交道10年的我给点个人看法: Swing的优点: 1:性能不错,因为其底子Java2D还不错,不是极其特别...

weixin_33809981的博客 1076

Swing模型与渲染器

Java基础类(JFC)Swing工具提供了使用Java平台创建高度可交互性图形用户界面的类。Swing是高度灵活的,但是也因此相当复杂,虽然新手能够使用Swing创建基本的图形用户界面(GUI),但是真要创建一个复杂、专业的GUI界面,你必须理解Swing的体系架构的基础,尤其是使用Swing创建复杂、像JTable、JTree、JComboBox以及JList这样基于渲染器的组件,Swing

expleeve 1265

java 程序性能分析

有些时候会分析下程序性能问题,仅根据个人的一些实践来说下。 java web的程序性能  一般都是针对访问多点的地方做个时间标记,模拟压测的打印log也是比较容易发现程序的一些问题的。 下面主要介绍java应用程序性能分析一些方法。 1:使用jdk自带的jvisualvm   在window下的cmd直接启动就可以了。xp下因为盘文件格式的问题,可能导致无法访问,需要修改一些配置的路径

huaye2007的专栏 888

如何优化Java程序性能

优化Java程序性能是一个多方面的任务,它涉及到代码设计、算法选择、内存管理、并发处理等多个方面。

wudixiuluo的博客 1311

Java程序性能和速度优化实例

          Java程序性能和速度优化实例   David Lee 例一:应用具有I/O Buffer功能Classimport java.io.*;  public class IoTest {public static void main(String args[]) { 

iBreathe的专栏 1205

Java程序性能优化

Java程序性能优化:

Mark Down Here 353

Java程序性能优化++让你的Java程序更快、更稳定

收藏自用 链接:Java程序性能优化++

ZQ1csdn的博客 1241

JAVa程序性能优化

JAVa程序性能优化 懂得计算机性能的都知道,性能反应慢体现为:界面停顿,抖动,反应迟钝等性能的表现有: 执行速度:程序是否迅速,响应时间是否够短 内存分配:内存分配是否合理,是否过多的消耗内存或者存在泄漏 启动时间:程序从运行可以正常的处理业务需要花费多长时间 负载承受能力:当系统压力...

banmao6200的博客 172

Zabbix对Java应用程序性能监控

帮助运维人员及时发现内存泄漏、线程阻塞、GC频繁等问题。实际应用中需结合业务需求调整监控指标及阈值,并注意生产环境的安全性配置。(Java网关)转发JMX请求,可采集JVM运行时数据及应用级指标。以下是具体应用方式及。Zabbix通过JMX监控Java应用,可全面覆盖。Zabbix对Java应用程序性能监控主要通过。

软件行业技术文化交流。 1658

Java程序性能优化:让你的Java程序更快、更稳定

Java是目前应用为广泛的软件开发平台,学习针对Java程序的优化方法有重要的现实意义。《Java程序性能优化:让你的Java程序更快、更稳定》以Java性能调优为主线,系统地阐述了与Java性能优化相关的知识与技巧。  《Java程序性能优化:让你的Java程序更快、更稳定》共6章,先后从软件设计、软件编码、JVM调优以及程序故障排斥等方面介绍针对Java程序的优化方法。第1章介绍性能的基本概念...

IT哈哈的博客 495

java 提高程序性能应做到的事

java 提高程序性能应做到的事

路虽远行则将至,事虽难做则必成 242

java程序性能瓶颈

今天,项目经理给大家分发了提高java编程效率的学习文档,看完之后,小小总结下: 所有的应用程序都存在性能瓶颈,为了提高应用程序性能,就要尽可能的减少程序的瓶颈。以下是在JAVA程序中经常存在的性能瓶颈。 瓶颈 Java程序中的操作 文件读写和网络操作 程序等待读写数据到网络或硬盘 CPU ...

langzi0007008的专栏 335

java程序性能优化_怎么做JAVA程序性能优化

展开全部1)尽量指定类、方62616964757a686964616fe59b9ee7ad9431333433623731法的final修饰符。带有final修饰符的类是不可派生的,Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,此举能够使性能平均提高50%。2)尽量重用对象。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收...

weixin_39644494的博客 86

Java程序性能优化 读书笔记

SerialGC、G1GC,同时适用于新老两代。

SteveJrong's Blog 818

Java程序性能优化StringBuffer与Vector

Java程序性能优化StringBuffer与Vector作者:佚名 来源:IT部落 2005-4-13 ? Java使得复杂应用的开发变得相对简单。毫无疑问,它的这种易用性对Java的大范围流行功不可没。然而,这种易用性实际上是一把双刃剑。一个设计良好的Java程序性能表现往往不如一个同样设计良好的C++程序。在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。养成

hwalan博客 1503

JAVA程序性能优化-让你的java程序更快、更稳定学习笔记一性能优化一般步骤

JAVA程序性能优化-让你的java程序更快、更稳定》学习笔记一性能优化一般步骤

aovenus的专栏-测试新时代(微信公众号:测试新时代) 1577

Java程序性能优化,如何让你的Java程序更快、更稳定

Java是目前应用最为广泛的软件开发平台之一,随着Java以及Java社区的不断壮大,Java早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。 作为一个平台,JVM虚拟机扮演着举重轻重的作用,除了Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala、JRuby等都是Java平台的一个部分,他们依赖JVM虚拟机,同时Java平台也因为它们变得更加丰富多彩。 作为一种文化,Java乎成为了“开源”的代名词,在Java程序中,有着数不清的

803
上一篇: NetBeans IDE 6.0 Preview
下一篇: Java程序性能之二
zfqjava
博客等级 码龄19年 298粉丝 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值