多執行緒斷點續傳(二)

2021-07-15 07:26:54 字數 2229 閱讀 6035

getview() 方法會重新呼叫一遍

1) 【問題】:多個執行緒在操作同乙個資料庫,導致資料庫鎖定的問題

資料庫設定為單例模式,保證這個類只有乙個物件,乙個例項。多個例項會產生多個地方去運算元據庫。單例的話,也就是說只有乙個例項會對資料庫進行訪問操作。

2) 【單例設計】:永遠只會被例項化一次

a) 私有化構造方法

b) 定義靜態物件引用

c) 獲得類例項的靜態方法

自己建立和銷毀執行緒也是會銷毀效能的,減少執行緒建立和銷毀所使用的時間,讓程式執行速度更快。

執行緒組成的池塘,當執行緒執行完成之後,不會簡單的銷毀執行緒,而是出於等待,當有新的任務開始,就從執行緒池中拿出執行緒復用,這樣就減少了執行緒建立和銷毀的次數,提高了程式執行的效能。

1) 執行緒池介面:executorservice

提供對執行緒池中的執行緒進行集中的管理,比如在某一段時間內,啟動某些任務,可以對所有的執行緒進行停止,啟動的任務。減少執行緒建立和銷毀所使用的時間,便於伺服器進行管理。減少了伺服器頻繁建立執行緒的資源消耗。

2) executors類提供四種執行緒池:

a) newcachedthreadpool():帶快取的執行緒池

b) newfixedthreadpool(int):固定執行緒數量的執行緒池

c) newscheduledthreadpool():可以週期性的,定時的去執行任務,執行緒數量沒有做限制

d) newsinglethreadexecutor():單個執行緒的執行緒池,所有的任務排隊執行,先來先執行

2) 執行緒池:對執行緒進行管理,會減少執行緒開銷。

執行緒池採用的是newcachedthreadpool帶快取的執行緒池,excute執行執行緒。好處是,減少了執行緒建立和銷毀所需要的時間,執行緒池會直接將空閒的執行緒拿過來進行使用。

1) 單例模式:

通過資料庫的幫助類dbhelper來運算元據庫,如果有多個例項的話,就會在多個地方運算元據庫,這是不安全的,所以將dbhelper設計為單例模式。

a) 將構造方法私有化

b) 初始化靜態物件引用

c) 建立靜態公共方法getintance,保證該資料庫幫助類dbhelper只建立一次

2) 執行緒安全:

a) 將資料庫的增刪改都設定為synchronized同步方法,保證同一時間段只有乙個執行緒在操作修改資料庫內容

b) 查詢資料庫不需要設定synchronized同步方法,因為並沒有對資料庫進行操作。使用同步方法會銷毀程式執行的效能,所以查詢建議不用使用同步鎖。

c) 修改獲取查詢資料庫的方式:

1) 網路連線:通過httpurlconnection設定和獲取網路請求

2) 檔案操作:關鍵使用randomaccessfile檔案操作流,可以在檔案的任意位置開始寫入,通過使用seek(index)設定檔案寫入的指標位置

1) 【問題】當乙個螢幕不能顯示全部的item的時候,就會因為item的復用而出現錯亂

2) 【原因】設定檔名和按鈕的操作放在第一次例項化的括號裡是不可取的。

生成list的 mfilelist的時候 注意新增的fileinfo的 id要和position一致,不然會錯亂(這點不太好 比如加入刪除任務功能後會比較麻煩)

可以在service的ondestory() 方法中對map mtasks遍歷 改ispaused為true

可以在service中初始化時判斷檔案是否存在

多執行緒斷點續傳(一)

1 基本ui定義 2 資料庫的操作 3 service的啟動 4 activity給service傳遞引數 5 使用廣播回傳資料到activity 6 執行緒和handler 7 網路操作 檔案的寫入,網路往本地磁碟寫入 1 連線網路檔案 2 獲取檔案長度 3 在本地建立檔案 4 設定檔案長度 第一...

三 多執行緒斷點續傳

conn.setrequestmethod get 獲取檔案總長度,然後建立長度一致的臨時檔案 向伺服器請求部分資料 conn.setrequestproperty range bytes startindex endindex conn.connect if conn.getresponsecod...

如何點對點實現多執行緒斷點續傳

dword winapi listenthread lpvoid lpparam file 進入迴圈,並接收到來的套接字 while 1 return 0 接著我們來看使用者執行緒 先看檔案訊息類定義 struct fileinfo file 使用者執行緒函式 dword winapi client...