锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Spark鏄疧penfire鐨勫鎴風錛?br />
Red5鏄熀浜巎ava鐨刦lash嫻佸獟浣撴湇鍔″櫒
浠ュ悗鏈夊叴瓚e氨鐮旂┒涓涓嬪瓙鍚?/p>
public class PiBinaryDigitsCalculator {
/**
* Returns the coefficient of 2^n in the binary
* expansion of pi.
* @param n the binary digit of pi to calculate.
* @throws ValidityCheckFailedException if the validity
* check fails, this means the implementation is buggy
* or n is too large for sufficient precision to be
* retained.
*/
public byte calculateBinaryDigit(final int n) {
return runBBPAlgorithm(n);
}
private byte runBBPAlgorithm(final int n) {
// Lengthy routine goes here ...
}
}
import java.util.HashMap;
public class PiBinaryDigitsCalculator {
private HashMap cache = new HashMap();
public synchronized byte calculateBinaryDigit(
final int n) {
final Integer N = new Integer(n);
Byte B = (Byte) cache.get(N);
if (B == null) {
byte b = runBBPAlgorithm(n);
cache.put(N, new Byte(b));
return b;
} else {
return B.bytevalue();
}
}
private byte runBBPAlgorithm(final int n) {
// Lengthy routine goes here ...
}
}
public interface BinaryDigitsCalculator {
public byte calculateBinaryDigit(final int n);
}
public class PiBinaryDigitsCalculator
implements BinaryDigitsCalculator {
public byte calculateBinaryDigit(final int n) {
return runBBPAlgorithm(n);
}
private byte runBBPAlgorithm(final int n) {
// Lengthy routine goes here ...
}
}
import java.util.HashMap;
public class CachingBinaryDigitsCalculator implements
BinaryDigitsCalculator {
private BinaryDigitsCalculator binaryDigitsCalculator;
private HashMap cache = new HashMap();
public CachingBinaryDigitsCalculator(
BinaryDigitsCalculator calculator) {
this.binaryDigitsCalculator = calculator;
}
public synchronized byte calculateBinaryDigit(int n) {
final Integer N = new Integer(n);
Byte B = (Byte) cache.get(N);
if (B == null) {
byte b =
binaryDigitsCalculator.calculateBinaryDigit(n);
cache.put(N, new Byte(b));
return b;
} else {
return B.bytevalue();
}
}
}
褰撹皟鐢ㄩ潤鎬佹柟娉昺emoize鐨勬椂鍊?灝嗕細鍒涘緩涓涓柊鐨勪唬鐞嗗疄渚?涔熷氨鏄竴涓猨ava.lang.reflect.proxy鐨勫疄渚?瀹炵幇浜嗕竴涓帴鍙i泦.榪欎釜鎺ュ彛闆嗙敱object.getClass().getInterfaces()鏉ュ喅瀹?姣忎釜浠g悊瀹炰緥鍖呭惈涓涓猨ava.lang.reflect.InvocationHandler瀹炰緥鏉ュ鐞嗚繖涓唬鐞嗗疄渚嬭皟鐢ㄧ殑鐩稿叧鏂規硶.鍦ㄦ垜浠殑渚嬪瓙閲?Memoizer灝辨槸涓涓狪nvocationHandler瀹炰緥.
褰撲竴涓柟娉曞湪浠g悊瀹炰緥閲岃璋冪敤,姣斿, calculateBinaryDigit,閭d箞, Memoizer瀹炰緥閲岀殑invoke鏂規硶灝變細琚皟鐢?鐩稿叧淇℃伅浼氫紶緇檌nvoke鏂規硶,浠ュ喅瀹歱roxy瀹炰緥璋冪敤浜嗗摢涓柟娉?鍖呭惈鍙傛暟淇℃伅.鍦ㄦ垜浠殑渚嬪瓙閲?浼犲叆Memoizer鐨刯ava.lang.Method鍙傛暟鏄痗alculateBinaryDigit,鑰屽弬鏁頒俊鎭垯鏄痯i闇瑕佺簿紜殑浣嶆暟-鏁存暟n.鍦ㄨ繖涓熀紜涓?Memoizer鑳藉榪涗竴姝ヨ繘琛岀紦瀛樻搷浣滅殑.
鍦ㄤ緥瀛愰噷(caches鏄竴涓狧ashmap,cache鏄竴涓猰ap)閲岀敤鍒扮殑Key,涓昏鏄紶鍏ョ殑鏂規硶淇℃伅:Method瀵硅薄鍜屽弬鏁板璞? 涓轟簡瀹炵幇鐨勭畝鍗曚笌閫氱敤鎬?Memoizer鏈変竴涓叧浜巆ache鐨凥ashMap caches,姣忎釜method鏄竴涓猭ey,瀵瑰簲鐨剉alue涓轟竴涓猚ache.鐒跺悗鎶婂弬鏁頒俊鎭漿鍖栨垚涓涓狶ist瀵硅薄,浣滀負cache鐨凨ey.浣跨敤List鏄緢鏂逛究鐨?鍚屾椂涔熷彲浠ヤ繚璇乪quals()鏂規硶,鎵浠ヨ兘澶熶繚璇佸綋涓斾粎褰撳弬鏁頒俊鎭畬鍏ㄧ浉鍚岀殑鏃跺欒繖涓狶ist鎵嶇浉絳?
涓鏃︿竴涓猚ache鐨凨ey琚垱寤?閭d箞,璁$畻涔嬪墠閮戒細鍏堟煡鎵捐繖涓猚ache,濡傛灉鎵懼埌,鍒欒繑鍥瀋ache閲岀殑鍊?鍚﹀垯,濡傛灉甯︽湁榪欎簺鍙傛暟鐨勮繖涓柟娉曟病鏈夎璋冪敤榪?閭d箞,鍒欎細閫氳繃invoke鏉ヨ皟鐢ㄨ繖涓猰ethod.鍦ㄦ垜浠殑渚嬪瓙閲? 瀹炰緥PiBinaryDigitsCalculator 閲岀殑calculateBinaryDigit鏂規硶灝嗕細閫氳繃invoke琚皟鐢?鑰屼笖璁$畻緇撴灉灝嗕細琚瓨鍦╟ache閲?
浣曟椂浣跨敤Memoizer
浣滀負涓鏉¢氱敤鐨勮鍒?Memoizer鑳藉鍦ㄤ換浣曢渶瑕佷紶緇熺殑cache鐨勬椂鍊欎嬌鐢?姣斿涓婇潰鎻愬埌鐨勪緥瀛? 鐗瑰埆鍦?鎺ュ彛閲屾瘡涓渶瑕佷嬌鐢ㄨ蹇嗗姛鑳界殑method闇瑕佹弧瓚充笅闈㈠嚑鏉℃潯浠?
1. 榪欎釜method鐨勮繑鍥炲兼渶濂戒笉瑕佹瘡嬈¤皟鐢ㄩ兘浼氭敼鍙榎r
2. 榪欎釜method涓嶈鏈夊壇鏁堝簲
3. 榪欎釜method鐨勫弬鏁版槸紜畾鐨?闈瀖utable鐨?
鏄劇劧,濡傛灉姣忔璋冪敤榪欎釜method榪斿洖鍊奸兘涓嶅悓,閭d箞cache灝辨鏃犵敤澶勪簡.鍚屾牱涔熸槸寰堥噸瑕佺殑涓鐐規槸,鍥犱負鏈夊壇鏁堝簲鐨刴ethod涓嶄細琚噸澶?鎵浠ヨ繖涓猰ethod涓嶈兘鏈夊壇鏁堝簲(method鑷姩鏇存柊鏌愪簺鐘舵?.褰撶劧,void鏂規硶闄ゅ.
鍚屾牱,memorize涓涓甫鏈夋湭瀹?mutable)鍙傛暟鐨刴ethod鏄緢鍗遍櫓鐨?鍥犱負,瑕佹妸榪欎簺鍙傛暟鍌ㄥ瓨鍒癶ashmap閲屼細鏄緢鍗遍櫓鐨勪竴浠朵簨.鏍規嵁Map鐨勫畾涔?褰撹繖涓狹ap閲岀殑key鍙戠敓鏀瑰彉,Map鏄笉鐭ラ亾鐨?鎵浠?褰撲綘鎵ц浜嗕竴嬈¤繖涓猰ethod涔嬪悗,鐩稿叧淇℃伅娣誨姞榪涗簡Map,鐒跺悗鍙傛暟鍙戠敓鍙樺紓(mutate),絎簩嬈¤皟鐢ㄧ殑鏃跺?灝變細寰楀埌閿欒鐨勭粨鏋?
鎬ц兘
浣跨敤cache鐨勪富瑕佺洰鐨勫氨鏄負浜嗘彁鍗囦綘鐨勭▼搴忕殑閫熷害.鐒惰?reflection紜槸浼楁墍鍛ㄧ煡鐨勪綆鏁?鍦╦dk1.4閲屾湁鎵鏀硅繘,閫氳繃reflection璋冪敤鏂規硶鏄櫘閫氳皟鐢ㄩ熷害鐨?/2,榪欎釜姣攋dk1.3瑕佸揩40鍊?.Memoizer涓昏渚濋潬reflection鏉ヨ皟鐢ㄦ柟娉?鎵浠?瀹冪湅涓婂幓騫朵笉鏄竴涓ソ鐨勯斿緞.浣嗘槸,濡傛灉浣跨敤cache鑳界粰紼嬪簭閫熷害甯︽潵鐨勬彁鍗囪繙楂樹簬reflection瀵歸熷害鐨勫獎鍝?閭d箞,浣跨敤Memoizer鏄煎緱鑰冭檻鐨?
鍦ㄦ垜浠PiBinaryDigitsCalculator鐨勬祴璇曚腑,嫻嬭瘯鐜涓簀dk1.4,褰搉灝忎簬10鐨勬椂鍊?浣夸笉浣跨敤cache閫熷害鏄浉褰撶殑.浣嗘槸,褰搉澧炲ぇ鐨勬椂鍊?浣跨敤cache鐨勪紭鍔垮氨寮濮嬫樉紺哄嚭鏉?鎵浠?緇忓父浣跨敤PiBinaryDigitsCalculator鐨勭敤鎴?鍙互鑰冭檻浣跨敤cache.
涓嶅垢鐨勬槸,鍞竴嫻嬭瘯浣犵殑紼嬪簭鏄惁闇瑕乧ache鐨勯斿緞鏄瘮杈冧綘鐨勭▼搴忓湪涓ょ鎯呭喌涓嬬殑榪愯鏁堢巼.灝界濡傛,鍥犱負涓轟竴涓▼搴忔瀯閫犱竴涓猚ache鍖呰鍣ㄦ槸寰堝鏄撶殑涓浠朵簨,縐婚櫎瀹冧篃鏄緢瀹規槗鐨?涓嬮潰鐨勫緩璁彲浠ヤ綔涓轟竴涓弬鑰冪殑姝ラ:
1. 閫夋嫨闇瑕佽蹇嗘搷浣滅殑綾籠r
2. 榪愯瀹僜r
3. 濡傛灉鏁堢巼鏄弧鎰忕殑,go to 6
4. 娣誨姞memoizer,浣跨敤cache
5. 濡傛灉鏁堢巼娌℃湁鏄捐憲鎻愬崌,縐誨垵memoizer
6. 濡傛灉闇瑕?閲嶈瘯.
鐞嗚涓?浣犻渶瑕佸垎鏋愪負涓涓被娣誨姞璁板繂鍔熻兘瀵規暣涓郴緇熺殑褰卞搷.鍙湁浣犺嚜宸辨竻妤氭槸鍚﹀煎緱娣誨姞.鏈変簺鏂規硶,鍗充嬌鏄綆楅噺寰堝ぇ鐨?浣嗘槸鍦ㄨ繖涓郴緇熼噷寰堝皯琚皟鐢?鎵浠?娌″繀瑕佷負瀹冩坊鍔犺蹇嗗姛鑳?涓轟簡淇濊瘉榪欎釜,鎴戝紑鍙戜簡涓涓洿鏈夌壒鐐圭殑Memoizer,瀹炵幇浜嗕竴涓彨鍋欳acheStatistics鐨勬帴鍙?浣犺兘浠庡畠寰楀埌cache鐨勬暟閲忎互鍙婃棤鏁堢殑cache.浣犲彲浠ヤ嬌鐢ㄥ畠浣滀負鍒ゆ柇鐨勪竴涓昂搴?
鎵╁睍Memoizer
淇敼Memoizer綾繪潵鏀寔涓嶅悓鐨刢ache絳栫暐鏄緢綆鍗曠殑.涓涓瘮杈冩櫘閫氱殑綾誨瀷灝辨槸Least-Recently-Used(LRU)cahce,鎷ユ湁鍥哄畾鏁伴噺鐨勫叆鍙?榪欎釜cache紜繚鍏ュ彛涓嶅ぇ浜庡畠鐨勬渶澶ф暟鐩?濡傛灉瓚呰繃,灝辨憭寮冩渶鏃х殑緙撳瓨鏁版嵁.涔熷氨鏄?鑳藉浠巆ache閲屽緱鍒扮殑鏄柊鐨勬暟鎹?涓涓被鍙互浣跨敤LRU cache鏉ラ槻姝竴涓▼搴忛暱鏈熶繚鎸佷竴涓姸鎬?浣犲彲浠ヤ粎浠呬紶閫掍竴涓弬鏁扮粰CacheFactory閲岀殑memoize鏂規硶鏉ラ夋嫨浣犻渶瑕佺殑cache綾誨瀷.涓嬮潰鐨勪緥瀛?LRU cache鏈澶氭湁1000涓叆鍙?
BinaryDigitsCalculator calculator =
(BinaryDigitsCalculator) Memoizer.memoize(
new PiBinaryDigitsCalculator(),
new LruCacheFactory(1000)
);
鍗充嬌鏄繖涔堢畝鍗?Memoizer涔熷簲璇ユ槸java紼嬪簭鍛樹竴涓湁鐢ㄧ殑宸ュ叿.
XMLRPC is message (XML) based and you can not use object at all. The advantage is security and reliability. With XML you can encrypt and validate any way you like. SOAP is XMLRPC on HTTP by XML message
private JButton button;
public MnemonicT() {
super("Mnemonic Test");
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(320, 240));
panel.setLayout(new FlowLayout());
button = new JButton(new AbstractAction("ClickTimes:" + count) {
public void actionPerformed(ActionEvent e) {
button.setText("ClickTimes:" + (++count));
}
});
panel.add(button);
add(panel);
InputMap im = button.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke("control A"), "buttonAction"); // 鎸塁TRL+A
button.getActionMap().put("buttonAction", button.getAction());
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MnemonicT().setVisible(true);
}
});
}
}