獲取物件的?
如果條件不滿足,wait,被通知後仍要檢查條件
條件滿足,執行對應的邏輯
synchronized(物件)
執行task
}
獲取物件的?
改變條件
通知所有等待該物件的執行緒
synchronized(物件)
但是實際使用中,會加入超時,保證消費者不會一直等待下去,阻塞該執行緒做其他的事情;
迴圈條件中加入判斷剩餘時間remaining這個條件:
public synchronized object get(long mills) throws interruptedexception
} else
}return condition;
}
連線池
public class connectionpool
}public void releaseconnection(connection connection) }}
public connection fetchconnection(long mills) throws interruptedexception
} else
}return pool.isempty() ? null : pool.removefirst();}}
}
連線驅動
public class connectiondriver
return null;}}
// 建立乙個connection的**,在commit時休眠100毫秒
public static final connection createconnection() , new connectionhandler());
}
測試**
如果連線池的連線數量固定,測試發現隨著客戶端執行緒增多,任務失敗比例會增大;這個很容易理解,每次都是m個執行緒,去爭搶n個資源;m大於n,就會出現無法搶到資源的執行緒,如果多次無法搶到,達到超時時間,自然就會失敗。public class connectionpooltest
is usedprofiler.begin();
start.countdown();
end.await();
system.out.println("total invoke: " + (threadcount * count));
system.out.println("got connection: " + got);
system.out.println("not got connection " + notgot);
system.out.println("total time: " + profiler.end());
}static class connectionrunner implements runnable
/*** when an object implementing inte***cerunnable
* to create a thread, starting the thread causes the object's
*
run
method to be called in that separately executing* thread.
* * the general contract of the method
run
is that it may* take any action whatsoever.
** @see thread#run()
*/@override
public void run() catch (interruptedexception e)
for (int i = 0; i < count; i++) catch (sqlexception e) finally
} else
} catch (interruptedexception e)
}end.countdown();}}
}
實際使用中,控制客戶端執行緒數量和資源數量的比例。當然任務時間和超時時間都是需要仔細考量的因素。
客戶端併發數量m, 資源池的資源數量n,單個任務時間tasktime,超時時間timeout – 成功率
如果完全公平鎖,可以保證時間t內,做完t/tasktime任務,理論可以100%成功率處理併發數為 timeout/tasktime * (n)的客戶端
乙個簡單的dao設計
最近把框架裡的資料庫連線池做好了,整個dao差不多也算完成了 因為懶,所以部分資料庫驅動還沒寫 整個dao由連線物件和解析驅動兩個部分組成,大概就是下面這個樣子 連線物件主要實現如下方法 解析器的作用是將操作狀態轉化為sql語句,主要實現以下功能 其中insert,update,query,dele...
乙個簡單API設計
用乙個紅綠燈來學習jsapi的設計 css trafficlight li trafficlight span trafficlight.stop li nth child 1 span trafficlight.wait li nth child 2 span trafficlight.pass ...
乙個簡單的JAVA網頁爬蟲
引用內容 public class access implements runnable catch exception e try catch malformedurlexception e catch ioexception e new thread this start public void...