春天里,百花香...
#
摘要: 一個解析文本中的信息并向對象賦值過程的思考,比較淺顯.
閱讀全文
摘要: private的成員變量能被子類繼承嗎?回答是父類的所有成員變量包括私有成員變量都會被子類繼承,private只是把可見性限制在改類內部的方法中而已,子類仍然可以通過父類的成員函數來訪問不可見的從父類繼承下來的私有成員.
這個機制對于復雜的類體系中保護父類不被濫用很有好處.
閱讀全文
摘要: 本文分析了java.util.ConcurrentModificationException出現的原因及處置辦法.
閱讀全文
摘要: 本文是"使XML作為持久存儲介質的解決方案 "的續文.
上文中對成員的CRUD都采用同步進行資源保護,這種方案實際上是保護過度,帶來的消極影響是降低了程序的效率,在下面的例子中,我們應該使用讀寫鎖對資源進行保護.關于讀寫鎖的分析請見"讀寫鎖的OO分析(http://m.tkk7.com/sitinspring/archive/2007/10/21/154652.html)".
...
閱讀全文
線程回調方式我們已經在"
使用回調和線程處理一個耗時響應過程"文中進行了講述,但是有些情況下用戶希望在指定時間內返回一個結果,免得無休止的等待下去.這時我們需要使用"限時線程回調方式",它在原有線程回調的基礎上加上了一個Timer以計算消耗的時間,如果時間期限到了任務還沒有執行完的話即中斷線程,示例代碼如下:
package com.sitinspring;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;


/** *//**
* 定時回調線程類
*
* @author sitinspring(junglesong@gmail.com)
*
* @date 2007-11-6
*/

public class TimedCallBackThread implements Runnable
{
// 一秒的毫秒數常量
private final static int ONE_SECOND = 1000;

// 限制時間,以秒為單位
private final int waitTime;

// 已經流逝的時間
private int passedTime;

private Timer timer;

private Thread thread;

private MvcTcModel model;

private MvcTcView view;


public TimedCallBackThread(MvcTcModel model, MvcTcView view, int waitTime)
{
this.model = model;
this.view = view;
this.waitTime = waitTime;
this.passedTime = 0;

// 創建并啟動定時器

timer = new Timer(ONE_SECOND, new ActionListener()
{

public void actionPerformed(ActionEvent evt)
{
timeListener();
}
});
timer.start();

// 創建并啟動線程來完成任務
thread = new Thread(this);
thread.start();
}


private void timeListener()
{
passedTime++;

// 動態顯示狀態
int modSeed = passedTime % 3;

if (modSeed == 0)
{
view.getLabel2().setText("響應中");

} else if (modSeed == 1)
{
view.getLabel2().setText("響應中..");

} else if (modSeed == 2)
{
view.getLabel2().setText("響應中
.");
}

// 如果流逝時間大于規定時間則中斷線程

if (passedTime > waitTime)
{
passedTime = waitTime;
thread.interrupt();
}
}


public void run()
{

while (passedTime < waitTime)
{

try
{
Thread.sleep(10000);// 模擬一個耗時相應過程
timer.stop();// 任務完成,停止Timer

view.getLabel2().setText(model.getText2());

} catch (InterruptedException ex)
{
timer.stop();// 線程中斷,停止Timer
view.getLabel2().setText("在指定時間內未響應");

} catch (Exception ex)
{
ex.printStackTrace();
}

return;
}
}
}
執行效果如下:

本文代碼下載(點擊第二個按鈕):
http://m.tkk7.com/Files/sitinspring/TimedThreadCallBack20071106194506.rar
摘要: 一般來說,可以把系統粗略的分為三個層次,視圖層,簡稱為View,它負責數據的輸出和輸入;業務層,簡稱為Model,它代表程序的實際業務;控制層,簡稱為Controller,處理界面的相應并調用業務層進行處理,有時把View和Controller兩層合稱為UI層。
在程序發展的歷史上,MVC模式進過了多次演化,MVC1和MVC2是兩種比較典型的模式,它們的區別主要在于View和Model的聯系方式...
閱讀全文
摘要: 我們有時會遇到對同一個內存區域如數組或者鏈表進行多線程讀寫的情況,一般來說有以下幾種處理方式:
1.不加任何限制,多見于讀取寫入都很快的情況,但有時也會出現問題.
2.對讀寫函數都加以同步鎖,比如使用singleton模式,這下問題是沒了,但效率也下去了,比如說兩個讀取線程不是非要排隊進入不可.
3.讀寫鎖,安全和效率都得到了解決,特別合適讀線程多于寫線程的情況.也就是下面將要展現的模式.
讀寫鎖的本意是分別對讀寫狀態進行互斥區分,有互斥時才加鎖,否則放行.互斥的情況有:
1.讀寫互斥.
2.寫寫互斥.
不互斥的情況是:讀讀,這種情況不該加以限制.
我們只要讓鎖對象知道當前讀寫狀態就可以了,再根據情況進行鎖定和解鎖,然后再分情況進行鎖定.請看代碼
閱讀全文
摘要: 這篇文章是"調度員,工人及任務的OO分析過程"的續篇.
上次的情況是由調度員主動分配任務,但有些情況下需要工人自動取得任務而不是由調度員分配,這時需要對線程進行通知,使用的主要方法就是對象的wait(),notify(),notifyAll()三個函數,它們都必須從同步方法(synchronized method)中調用.
閱讀全文
摘要: 日常編碼中,我們常需要為各種業務進行建模,為工廠中的任務調度建模就很有意思的,它的主要流程是基本是這樣:
1.調度員將工件圖紙交付給工人,這是任務的下達.
2.工人工作,完成工件,這是任務的進行過程.
3.工件完成后,工人將圖紙和工件返還給調度員,或者到了確定的時間后由調度員去取.這是任務的完成.
4.重復上述三個步驟.
在這個流程中,還存在一些特征:
1.工人可以有多項任務,但他在一個時間只能做一個活,具體做那個由任務的優先級確定.
2.任務完成后要讓調度員知道,現實中是工人來找調度員或者調度員找工人來實現的.
從上述情況分析,我們需要任務,工人,調度員三個類來完成建模,另外為了方便任務的存儲和管理,還需要一個任務串類來輔助.
閱讀全文
sitinspring(http://m.tkk7.com)原創,轉載請注明出處.