熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

用JAVA實現線程等待提示框

2013-11-23 19:59:20  來源: Java高級技術 

  Java語言從其誕生到現在不過短短五年時間卻已經成為全球最熱門的語言Java程序員正成為IT業其它程序員中薪金最高的職員這一切都應歸功於Java良好的特性簡單面向對象分布式平台無關性可移植性支持多線程等等本文將用Java的多線程特性來實現線程等待提示框

  問題的提出

  在Java應用程序編程中有時需要在GUI(圖形化用戶界面)中處理一些占用系統資源較多耗費時間較長的事務例如與數據庫進行大批量數據交換大數據量的復雜運算遠程連接服務器等等系統在處理這些事務時如果還是使用GUI所在的線程會導致界面凍結無法刷新看起來好象系統已經崩潰這是一個良好的軟件系統不允許出現的局面

  解決問題的途徑

  解決上述問題的方法就是采用Java的多線程特性為這些耗時又耗資源的事務再開一個線程單獨運行並在GUI處出現提示框正在執行請等待在線程結束時自動關閉該提示框這樣即避免了上面出現的界面凍結情況又保證了線程的安全性是軟件開發者上佳的選擇

  具體實現

  ()例子

  這裡舉一個簡單的例子來介紹如何用JAVA實現線程等待提示框

  此例實現一個很簡單的GUI根窗體testFrame是一個JFrame(框架)類在testFrame中放置一個JPanel(面板)testPanel 最後將一個JButton(按鈕)testButton添加到testPanel中

  按下testButton系統開始運行一個模擬的耗時又耗資源的事務在標准輸出設備上顯示從同時出現線程正在運行提示框一旦事務完成(即線程結束)系統自動關閉該提示框

  ()實現方法

  為了達到上述功能可以這樣來實現

  當按下按鈕後啟動一個新的線程來完成事務即在標准輸出設備上顯示從(在代碼中通過TestThread類來實現)緊接著再啟動一個線程來顯示線程正在運行提示框(在代碼中通過ThreadDiag類來實現)

  為了使提示框在TestThread結束後自行關閉在TestThread啟動後還啟動了一個DisposeDiag線程這個線程專門用來等待TestThread線程結束後關閉線程正在運行提示框

  ()程序代碼及注釋

  ① TestFrame類

  TestFrame是Java運行主程序用來顯示用戶界面

  import javaxswing*;
  import javaawt*;
  import javaawtevent*;
  public class TestFrame extends JFrame
  {
   //GUI所需組件
   public JPanel testPanel = null;
   public JButton testButton = null;
   public JFrame testFrame = null;
   public TestFrame()
   {
    //設置GUI為windows風格
    try
    {
     UIManagersetLookAndFeel(
     comsunjavaswingplafwindowsWindowsLookAndFeel);
    }
    catch (Exception ex) 
    {
     Systemoutprintln(Exception: + ex);
    }
    testFrame = this;
    // 初始化GUI
    Dimension dimensions = ToolkitgetDefaultToolkit()getScreenSize();
    setSize(dimensionswidth / dimensionsheight /);
      setLocation(dimensionswidth/dimensionswidth/ 
      dimensionsheight/dimensionsheight/);
    testPanel = new JPanel();
    testButton = new JButton(開始線程);
    testPaneladd(testButton);
    getContentPane()add(testPanel);
    //增加按鈕testButton事件監聽器
    testButtonaddActionListener(new javaawteventActionListener() {
    public void actionPerformed(ActionEvent e) {
    TestThread testThread = new TestThread();//新生成一個處理事務線程
    testThreadstart();//啟動事務線程
    (new ThreadDiag(testFrame testThread  
     正在執行請等待))start();//啟動等待提示框線程
    }
   });
     //增加testFrame事件監聽器
   addWindowListener(new WindowAdapter()
   {
    public void windowClosing(WindowEvent e) {
    Systemexit();
     }
   });
  }
   public static void main(String[] args) 
   {
    //主程序
    TestFrame testFrame = new TestFrame();
    testFramesetTitle(線程等待測試);
    testFrameshow();
   }
  }  

  ② TestThread類

  TestThread類是處理事務線程即在標准輸出設備上顯示從  

public class TestThread extends Thread
 {
  public void run()
  {
   for (int i = ; i < ; i++ )
   {
    Systemoutprintln(i);
   }  
  }
 }

  ③ ThreadDiag類

  ThreadDiag類用來顯示線程正在運行提示框

  import javaawt*;
  import javaxswing*;
  public class ThreadDiag extends Thread
  {
   private Thread currentThread = null;//實際調用時就是TestThread事務處理線程
   private String messages = ;//提示框的提示信息
   private JFrame parentFrame = null;//提示框的父窗體
   private JDialog clueDiag = null;// 線程正在運行提示框
   private Dimension dimensions = ToolkitgetDefaultToolkit()getScreenSize();
   private int width = dimensionswidth / height = ;
   private int left = top = ;
   public ThreadDiag(JFrame parentFrame Thread currentThread String messages)
   {
    thisparentFrame = parentFrame;
    thiscurrentThread = currentThread;
    thismessages = messages;
    initDiag();//初始化提示框
   }
   protected void initDiag()
    {
    clueDiag = new JDialog(parentFrame正在執行請等待true);
    clueDiagsetCursor(new Cursor(CursorWAIT_CURSOR));
    JPanel testPanel = new JPanel();
    JLabel testLabel = new JLabel(messages);
    clueDiaggetContentPane()add(testPanel);
    testPaneladd(testLabel);
    (new DisposeDiag())start();//啟動關閉提示框線程
   }
  public void run()
   {
    //顯示提示框
    int left = (dimensionswidth width)/;
    int top = (dimensionsheight height)/;
    clueDiagsetSize(new Dimension(widthheight));
    clueDiagsetLocation(left top);
    clueDiagshow();
   }
  }

  ④ DisposeDiag類

  DisposeDiag類用來關閉提示框

class DisposeDiag extends Thread
{
 public void run()
 {
 try
 {
  currentThreadjoin();//等待事務處理線程結束
 }
 catch(InterruptedException e)
 {
  Systemoutprintln(Exception: + e);
 }
 clueDiagdispose();//關閉提示框
}
}

  注為了共用變量clueDiag上述ThreadDiag類和DisposeDiag類放在同一個Java文件內如果分開存放只需傳遞一下參數即可

  上述程序在jdk下運行通過

  ()程序運行結果

  運行結果如下圖所示

  當事務執行完後正在執行提示框自動關閉


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27781.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.