少年阿賓那些青春的歲月 |
import MySQLdb import time try: conn=MySQLdb.connect(host='localhost',user='root',passwd='',db='abin',port=3306) cur=conn.cursor() result=cur.execute('select * from tabin') print result print '-------' info=cur.fetchmany(result) for ii in info: currentTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) values=[ii[1],currentTime] cur.execute('insert into sabin (name,create_time) values (%s,%s)',values) print '====' cur.close() conn.commit() conn.close() except MySQLdb.Error,e: print "Mysql Error %d: %s % ()e.args[0],e.args[1]"
import urllib params = urllib.urlencode({'type':'mobile','parameter':'13521502037','pageNum':1,'pageSize':10}) conn = urllib.urlopen("http://test.qunar.com:7400/complaints/find.action",params); result = conn.read() print result 一 前言
tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,可以看他的啟動控制臺,或者啟動日志.或者登錄他們的默認頁面http://localhost:8080/查看其中的服務器狀態。 二 bio 默認的模式 blocking IO,性能非常低下,沒有經過任何優化處理和支持. 三 nio 利用java的異步io護理技術,no blocking IO技術. 想運行在該模式下,直接修改server.xml里的Connector節點,修改protocol為 <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" /> 啟動后,就可以生效。性能得到初步優化但與apr相比,還是有一些差距。 四 apr 安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能. 必須要安裝apr和native,直接啟動就支持apr。 下面的修改純屬多余,僅供大家擴充知識,但仍然需要安裝apr和native 如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol 五 補充 1)安裝APR的方法,請看我另一篇博客http://phl.iteye.com/blog/910984; 2)關于性能數據請讀者們自行研究,筆者不是在寫教科書在此只是給出思路,性能研究是個很深的領域,請各位按需自行搭建環境測試; 3)總的來說,bio是不推薦使用的,apr的模式推薦;
http://phl.iteye.com/blog/910996 先來個例子理解一下概念,以銀行取款為例:
Java對BIO、NIO、AIO的支持:
BIO、NIO、AIO適用場景分析:
另外,I/O屬于底層操作,需要操作系統支持,并發也需要操作系統的支持,所以性能方面不同操作系統差異會比較明顯。 本文出自 “力量來源于赤誠的愛!” 博客,請務必保留此出處http://stevex.blog.51cto.com/4300375/1284437 一、線程池的創建 我們可以通過ThreadPoolExecutor來創建一個線程池。 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler); 創建一個線程池需要輸入幾個參數:
二、Executors提供了一些方便創建ThreadPoolExecutor的常用方法,主要有以下幾個: 1、 Executors.newFixedThreadPool(int nThreads);創建固定大小(nThreads,大小不能超過int的最大值)的線程池 //線程數量 int nThreads = 20; //創建executor 服務 ExecutorService executor = Executors.newFixedThreadPool(nThreads) ; 重載后的版本,需要多傳入實現了ThreadFactory接口的對象。 ExecutorService executor = Executors. newFixedThreadPool(nThreads,threadFactory); 說明:創建固定大小(nThreads,大小不能超過int的最大值)的線程池,緩沖任務的隊列為LinkedBlockingQueue,大小為整型的最大數,當使用此線程池時,在同執行的任務數量超過傳入的線程池大小值后,將會放入LinkedBlockingQueue,在LinkedBlockingQueue中的任務需要等待線程空閑后再執行,如果放入LinkedBlockingQueue中的任務超過整型的最大數時,拋出RejectedExecutionException。 2、Executors.newSingleThreadExecutor():創建大小為1的固定線程池。 ExecutorService executor = Executors.newSingleThreadExecutor(); 重載后的版本,需要多傳入實現了ThreadFactory接口的對象。 ExecutorService executor = Executors. newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 說明:創建大小為1的固定線程池,同時執行任務(task)的只有一個,其它的(任務)task都放在LinkedBlockingQueue中排隊等待執行。 3、Executors.newCachedThreadPool();創建corePoolSize為0,最大線程數為整型的最大數,線程keepAliveTime為1分鐘,緩存任務的隊列為SynchronousQueue的線程池。 ExecutorService executor = Executors.newCachedThreadPool(); 當然也可以以下面的方式創建,重載后的版本,需要多傳入實現了ThreadFactory接口的對象。 ExecutorService executor = Executors.newCachedThreadPool(ThreadFactory threadFactory) ; 說明:使用時,放入線程池的task任務會復用線程或啟動新線程來執行,注意事項:啟動的線程數如果超過整型最大值后會拋出RejectedExecutionException異常,啟動后的線程存活時間為一分鐘。 4、Executors.newScheduledThreadPool(int corePoolSize):創建corePoolSize大小的線程池。 //線程數量 int corePoolSize= 20; //創建executor 服務 ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize) ; 重載后的版本,需要多傳入實現了ThreadFactory接口的對象。 ExecutorService executor = Executors.newScheduledThreadPool(corePoolSize, threadFactory) ; 說明:線程keepAliveTime為0,緩存任務的隊列為DelayedWorkQueue,注意不要超過整型的最大值。
1、volatile
volatile字段的寫入操作happens-before于每一個后續的同一個字段的讀操作。 因為實際上put、remove等操作也會更新count的值,所以當競爭發生的時候,volatile的語義可以保證寫操作在讀操作之前,也就保證了寫操作對后續的讀操作都是可見的,這樣后面get的后續操作就可以拿到完整的元素內容。 使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。 volatile實際上只有在多cpu或者多核下才有用。當讀取數據時,他不會cache緩存中讀取,而是強制從內從中讀取,這樣讀到的就是最新值。當寫入數據的時候,會直接將數據寫入內存中,并刷新所有其他核中的緩存,這樣其他核看到的就是最新寫入的值,也就是說,其他線程就看到了最新寫入的值。 一般說來,volatile用在如下的幾個地方: 1、中斷服務程序中修改的供其它程序檢測的變量需要加volatile; 2、多任務環境下各任務間共享的標志應該加volatile; 3、存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;
volatile 修飾符通常用于由多個線程訪問而不使用 lock 語句來序列化訪問的字段。使用 volatile
修飾符能夠確保一個線程檢索由另一線程寫入的最新值。 讀文件的方法: 第一步: 將文件的內容通過管道(|)或重定向(<)的方式傳給while 第二步: while中調用read將文件內容一行一行的讀出來,并付值給read后跟隨的變量。變量中就保存了當前行中的內容。 例如讀取文件/sites/linuxpig.com.txt 1)管道的方式: 當然也可以將cat /sites/linuxpig.com.txt 寫成一些復雜一些的,比如: 可以將含有 "linuxpig.com" 字符串的所有文件打開并讀取。。 示例沒有實際測試,如果使用請先測試。。。。。:-) 2)重定向的方式: 2.1 利用重定向符< while read LINE 2.2 利用文件描述符(0~9)和重定向符 < exec 3<&0
1、free -m
2、uptime 3、vmstat 1 5 4、iostat -x -h -t 5、mpstat -P ALL 6、netstat -natp | grep 8080 7、netstat -natp | find "80"(windows) 8、ps -aux | grep java 9、ps -ef | grep java 10、top -H -p 9768 1、把命令結果賦值給變量 #!/bash/bin echo "1 2 3 4"|awk '{print $1}' temp=`echo "1 2 3 4"|awk '{print $1}'`; echo $temp;
2、
|