1. 程式人生 > >測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態同步更新資料

測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態同步更新資料

(原創)

測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態更新,同步顯示資料

主類:

package testguimulitiplethread;

/**
*
* @author Administrator
*/
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       NewJFrame nf =new NewJFrame();
    }

}

執行緒類:

package testguimulitiplethread;

/**
*
* @author Administrator
*/
public class TestThread extends Thread{

    NewJFrame nf;
    @Override
    public void run() {
//在Count中暫停執行緒即可,無需在run()中暫停執行緒。
/*while(true){
    if(nf.getFlag()==1){
   try {
      Thread.sleep(1000);
   } catch (InterruptedException ex) {
     //
   }
    }*/ 
//   else{
   Count.testCount(nf);
   //執行計算完畢後跳出,執行緒結束。
   nf.setFlag(-1);
// break;
//   }
//}

    }

}

計算任務類:

package testguimulitiplethread;


/**
*
* @author Administrator
*/
public class Count {
    static int c = 10000;
    public static void testCount(NewJFrame nf){
for(int i=0;i<c;i++){
     
     //先考慮暫停情況:
     while(nf.getFlag()==1){//sleep():暫停,迴圈暫停。
      try {
    Thread.sleep(1000);
      } catch (InterruptedException ex) {
        //
      }
   }
     //再考慮跳出情況:
     if(nf.getFlag()==-1){
      break;
     }
     //最後才輸出:
     System.out.println(i);
     nf.getJLabel1().setText(String.valueOf(i));///
     
   //未未優化前的程式碼: 
   /* if(nf.getFlag()==0){
     System.out.println(i);
     nf.getJLabel1().setText(String.valueOf(i));///
     }
     else{
   if(nf.getFlag()==-1){
      break;
   }
   while(nf.getFlag()==1){//sleep():暫停,迴圈暫停。
      try {
    Thread.sleep(1000);
      } catch (InterruptedException ex) {
        //
      }
   }
   //別漏了輸出:
     System.out.println(i);
     nf.getJLabel1().setText(String.valueOf(i));///
     }*/
     
}
    }
    public static void testCount(){

    }
}

介面顯示類:(注:介面是用netbeans6.1裡的JFrame類選項來建立的)

/*
* NewJFrame.java
*
* Created on 2010年4月24日, 上午11:25
*/

package testguimulitiplethread;


/**
*
* @author Administrator
*/
public class NewJFrame extends javax.swing.JFrame {

    private int flag = -1;//-1:未啟動,0:啟動,1:暫停
   TestThread   t ;
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
this.setVisible(true);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("開始");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("空");

        jButton2.setText("暫停");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setText("結束");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(96, 96, 96)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 156, Short.MAX_VALUE)
                        .addGap(18, 18, 18))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE)
                        .addComponent(jButton2)
                        .addGap(28, 28, 28)))
                .addComponent(jButton3)
                .addContainerGap(73, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 83, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton3)
                    .addComponent(jButton2))
                .addGap(83, 83, 83))
        );

        pack();
    }// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//由於程式比較簡單,所以提供了暫停功能。而且,在該程式中計算比較簡單,所以在計算中暫停依舊可以保持執行緒安全。
//但對於複雜計算是不是也能提供暫停功能呢?疑惑中……複雜計算的流程多,迴圈跳轉也多,要在暫停的同時保證執行緒安全難道要把整個程式暫停?    
if(flag==-1){
    flag=0;
    jButton1.setEnabled(false);
    jButton1.setText("繼續");
    t   =   new   TestThread();
    t.nf = this;
          t.start()   ;   
}
if(flag==1){
     flag=0;
}

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    if(flag==0){
flag=1;
jButton1.setEnabled(true);
    }
}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
flag = -1;
jLabel1.setText("空");
jButton1.setEnabled(true);
jButton1.setText("開始");
}

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration

    public javax.swing.JButton getJButton1() {
return jButton1;
    }

    public javax.swing.JButton getJButton2() {
return jButton2;
    }

    public javax.swing.JLabel getJLabel1() {
return jLabel1;
    }

    public int getFlag() {
return flag;
    }

    public void setFlag(int flag) {
this.flag = flag;
    }

}

-------------------------------------------------------------------------

程式碼都在上面了,大家注意看註釋~~~~~~~~~

水平有限,望大家不吝賜教~~~~~~~~~~~~~~

今天中午沒吃飯,囧~~~~~~~~~~~~~~~~~~~

今天天氣不錯,外面的小鳥叫了N天了,也不累~

轉載請註明出處,伸手黨自重~~~~~~~~~~~~~

相關推薦

測試程式碼解決java gui swing執行介面僵死問題實現介面動態重新整理動態同步更新資料

(原創) 測試程式碼,解決java gui swing多執行緒介面假死、僵死問題,實現介面動態重新整理,動態更新,同步顯示資料 主類: package testguimulitiplethread; /** * * @author Administrator */ public class Mai

執行中的方法兩種實現方式匿名內部類建立執行執行安全問題的解決

多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 方式一: 步驟: // 1. 定義一個類,然後繼承Thread //

java swing執行處理情況下UI解決

背景&問題專案中使用java swing做了個多執行緒處理任務的介面,在介面上顯示多執行緒任務的log資訊,為了實時顯示log資訊,使用了log4j的org.apache.log4j.WriterAppender並單獨開了執行緒。但是log資訊只在多執行緒任務結束後才

#圖文詳解:從實際和理論出發帶你瞭解Java中的執行

這裡並沒有講什麼新東西,只是把多執行緒一些知識來個總結。大家懂得可以複習複習,還有些童鞋對多執行緒朦朧的可以拿這個做為入門~ 舉個栗子說明啥是多執行緒:玩遊戲,前面一堆怪,每個怪都是一個執行緒,你射了一槍,子彈飛出去了,這顆子彈也是一個執行緒。你開啟你的程序管理,看到你遊戲的後臺程序,這就是程序

Java高併發——執行協作同步控制

      繼上一篇:Java高併發——多執行緒基礎 中講到,共享資源的合理使用,才能夠使多執行緒程式有條不紊的執行。其中我們通過synchronized來實現臨界區資源的是否可以訪問。而,這篇我們來重點總結synchronized的增強替代版鎖,以及其它JD

Java執行學習筆記(一)之中斷中的Interruptinterrupted()isInterrupted()

1、關於中斷 在Java中中斷最初是通過stop()來終止執行緒的,後來發現這樣簡單粗暴的停止執行緒會產生很多問題(例如物件monitor的釋放),所以改為deprecated,推薦使用interrupt()來中斷執行緒。而對於執行緒來說,會持有一個inter

JAVA基礎24-執行(四)【讀寫鎖阻塞佇列執行池】

一、讀寫鎖   使用步驟 二、阻塞佇列 (BlockingQueue) 提供執行緒安全的佇列訪問方式; 當阻塞佇列進行插入資料時,若佇列滿,則執行緒阻塞,直到佇列非滿的時候 當阻塞佇列取資料時,若佇列為空,則執行緒阻塞直到佇列非空時候。

JAVA基礎23-執行(三)【synchronizedReentranLockvolatile鎖】

一、同步         大多數多執行緒應用中,兩個或兩個以上的執行緒需要共享對同一資料的存取,此時出現多個程式交替處理該資料,從而導致資料出現訛誤。 9-1.Synchronized關鍵字       &nb

JAVA基礎22-執行(一)【執行的概念執行狀態及其轉換】

多執行緒 一.概念          1. 程序:程序是表示資源分配的的基本概念,又是排程執行的基本單位,是系統中的併發執行的單位。           2. 執行緒:單個程序中執行中

java基礎】執行匿名內部類和lambda建立方式執行中的兩個面試題

一、可以用匿名類和lambda兩個種方式建立多執行緒。 1.利用匿名內部類建立多執行緒並開啟。 new Thread() {//建立方式1 public void run() { for(int x=0; x<50; x++) { System.out

解決java Android 中同一個執行執行問題

在java中同一個執行緒只能被start()一次,當第二次start()就會報異常。但是我們的軟體需求常常需要同一個執行緒多次執行同一個方法。為此可以使用notify(),wait()方法來達到我們想要的效果。先看程式碼public class ThreadTest ext

java封裝FFmpeg命令支援原生ffmpeg全部命令實現FFmpeg程序處理與執行輸出控制(開啟關閉查詢)rtsp/rtmp推流拉流

前言: 之前已經對FFmpeg命令進行了封裝http://blog.csdn.net/eguid_1/article/details/51787646,但是當時沒有考慮到擴充套件性,所以總體設計不是太好,需要改動的地方也比較多,也不支援原生ffmpeg命令,所以本次版本推翻

android 利用java中的執行和io流最快速度的下載伺服器檔案,android 實現apk下載展現通知欄

首先,我們得來說下多執行緒下載實現的大致思路,以及在使用多執行緒下載過程應該需要注意的問題。      多執行緒下載實現的大致思路:      大致思路是這樣的,也就是把整個一個檔案資源分為若干個部分,然後開啟若干個執行緒,並且使得每個執行緒負責下載每個子部分的檔案,由於

【原創】中文分詞系統 ICTCLAS2015 的JAVA封裝和執行執行(附程式碼

  本文針對的問題是 ICTCLAS2015 的多執行緒分詞,為了實現多執行緒做了簡單的JAVA封裝。如果有需要可以自行進一步封裝其它介面。   首先ICTCLAS2015的傳送門(http://ictclas.nlpir.org/),其對中文分詞做的比較透徹,而且有一定的可調式性。但是應用到實際開發中的話

java學習day23-執行的引入同步

 (2)Java程式的執行原理及JVM的啟動是多執行緒的嗎?  Java程式的執行原理: *   由java命令啟動JVM,JVM啟動就相當於啟動了一個程序。 *   接著有該程序建立了一個主執行緒去呼叫main方法。 *  * 思考題: *   jvm虛擬機器的啟動是單執行緒的還是多執行緒的? *    多

軟體構造-經驗-重繪GUI執行的一次debug

記一次debug 在哈工大軟體構造的lab6中,要求我們用多執行緒來對猴子過河的決策過程進行模擬。 這個實驗的構造思路其實比較簡單,就是為每個猴子建立一個決策執行緒,每一隻猴子都有自己的決策方式,但是所有猴子共用一條河。這也就意味著race condition的存在。 可能出現這樣的情況,兩隻猴子同時決

40道阿里巴巴JAVA研發崗執行面試題詳解你能答出多少

1、多執行緒有什麼用? 一個可能在很多人看來很扯淡的一個問題:我會用多執行緒就好了,還管它有什麼用?在我看來,這個回答更扯淡。

Java筆記】執行實現簡單的非同步運算

實現Callable介面,重寫call()方法,使操作執行緒池時能帶有返回值的效果: import java.util.concurrent.Callable; public class GetSumCallable implements Callable<Integer> {

Java中的執行你只要看這一篇就夠了(轉)

引 如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個執行緒吧,否

java核心技術-執行基礎

程序、執行緒 ​ 程序(Process) 是程式的執行例項。例如,一個執行的 Eclipse 就是一個程序。程序是程式向作業系統申請資源(如記憶體空間和檔案控制代碼)的基本單位。執行緒(Thread)是程序中可獨立執行的最小單位。一個程序可以包含多個執行緒。程序和執行緒的關係,好比一個營業中的飯店與其正在工