Java - 堆疊的應用 for 動態資料載入

相信堆疊大家應該都很熟悉了,在此不會說明它的定義,應該google一下就可以得到答案。在此要利用它的後進先出的概念來套用到動態資料載入上,而在這邊也會寫個實作範例,但真的是個很簡單的範例,也許跟資料載入掛勾不起來,但會盡量舉圖例來呼應其應用想法!

假設有一Excel表格如下,當scroll bar往下一拉,會觸發資料載入的event使得第14列以後的資料同步等待被載入,而好死不死user瞬間一拉就拉到第1000列,而每載入一列資料還得先去query,response回來都將近0.5秒了,如此一來拉到第1000列的當下可想而知資料根本還沒來得及做完,可能還有數百列在等候要query勒,此時看到的9XX~1000列一定還是空! 這將造成user的疑惑想說怎麼load那麼慢?!
PS. 在此query速度固定,且假設被query的對象一次只能處理一筆query   

好,舉了個遭遇困難的例子,若我們套用stack後又會變成怎麼樣呢? 若對stack有一點概念的話應該可以馬上聯想到,套用stack進來後對這手殘的瞬間往下一拉的query會有什麼影響吧?!

程式範例如下:
  int size = 10;
  Stack<Integer> container = new Stack<>();
  Thread process = new Thread() {
     public void run() {
        try {
           while(container.size() != 0) {
              System.out.println("pop: "+container.pop());
              Thread.sleep(500);
           }
        } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        } 
     }
  };
  for(int i = 0 ; i < 20 ; i++) {
     try {
        Thread.sleep(10);
        System.out.println("stack: "+container.toString());
        if(container.size() >= size) {
           System.out.println("remove: "+container.remove(0));
        }
        System.out.println("push: "+container.push(i));
        if(process.getState() == Thread.State.NEW) {
           process.start();
        }
     } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
  }

挖哩這算啥例子! 讓人很難聯想到動態資料載入! 只看到一個Thread及Stack在那邊push、pop等等。確實在此只是講個概念!
1. for迴圈就好比往下一拉的瞬間要query的列數,在此設定20列(1000列可能會印到.....)
2. 設定stack的大小不超過10筆,超過的話remove掉第一筆資料
3. Thread如同處理query的角色,當push第一筆時即啟用
4. Thread做什麼事呢? 針對stack pop出來的資料做處理,且一次須處理0.5秒

最後輸出結果如下:
stack: []
push: 0
pop: 0
stack: []
push: 1
stack: [1]
push: 2
stack: [1, 2]
push: 3
stack: [1, 2, 3]
push: 4
stack: [1, 2, 3, 4]
push: 5
stack: [1, 2, 3, 4, 5]
push: 6
stack: [1, 2, 3, 4, 5, 6]
push: 7
stack: [1, 2, 3, 4, 5, 6, 7]
push: 8
stack: [1, 2, 3, 4, 5, 6, 7, 8]
push: 9
stack: [1, 2, 3, 4, 5, 6, 7, 8, 9]
push: 10
stack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
remove: 1
push: 11
stack: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
remove: 2
push: 12
stack: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
remove: 3
push: 13
stack: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
remove: 4
push: 14
stack: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
remove: 5
push: 15
stack: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
remove: 6
push: 16
stack: [7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
remove: 7
push: 17
stack: [8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
remove: 8
push: 18
stack: [9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
remove: 9
push: 19
pop: 19
pop: 18
pop: 17
pop: 16
pop: 15
pop: 14
pop: 13
pop: 12
pop: 11
pop: 10

恩,這個輸出結果可以想到,當user心一狠往下一拉時,可以看到stack起了一個作用,那就是你一拉的瞬間之中的列我都不管了,因為處理容量有限阿,快爆掉的當下就被我捨棄掉舊資料了! 而user一停下來的瞬間,可視畫面的列當下就會立即處理,由於stack後進先出的概念使得我們馬上可以看到資料被載入!
PS. 若是有視窗一次可以看到1000列可能就不適合上面的做法,因為你會看到最下面有資料而上面一片空蕩蕩XDDD

留言