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

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

import javax.swing.Timer;


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

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

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

// 已經(jīng)流逝的時(shí)間
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;

// 創(chuàng)建并啟動(dòng)定時(shí)器

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

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

// 創(chuàng)建并啟動(dòng)線程來(lái)完成任務(wù)
thread = new Thread(this);
thread.start();
}


private void timeListener()
{
passedTime++;

// 動(dòng)態(tài)顯示狀態(tài)
int modSeed = passedTime % 3;

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

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

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

// 如果流逝時(shí)間大于規(guī)定時(shí)間則中斷線程

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


public void run()
{

while (passedTime < waitTime)
{

try
{
Thread.sleep(10000);// 模擬一個(gè)耗時(shí)相應(yīng)過(guò)程
timer.stop();// 任務(wù)完成,停止Timer

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

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

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

return;
}
}
}
執(zhí)行效果如下:

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