亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android線程池控制并發(fā)數(shù)多線程下載

2019-10-21 21:30:54
字體:
供稿:網(wǎng)友

多線程下載并不是并發(fā)下載線程越多越好,因為當(dāng)用戶開啟太多的并發(fā)線程之后,應(yīng)用程序需要維護(hù)每條線程的開銷,線程同步的開銷。

這些開銷反而會導(dǎo)致下載速度降低。因此需要避免在代碼中直接開啟大量線程執(zhí)行下載。

主要實現(xiàn)步奏:

1、定義一個DownUtil類,下載工作基本在此類完成,在構(gòu)造器中初始化UI線程的Handler。用于子線程和UI線程傳遞下載進(jìn)度值。

2、所有的下載任務(wù)都保存在LinkedList。在init()方法中開啟一個后臺線程,不斷地從LinkedList中取任務(wù)交給線程池中的空閑線程執(zhí)行。

3、每當(dāng)addTask方法添加一個任務(wù),就向 mPoolThreadHandler發(fā)送條消息,就從任務(wù)隊列中取出一個任務(wù)交給線程池執(zhí)行。這里使用了使用了Semaphore信號量,也就是說只有當(dāng)一個任務(wù)執(zhí)行完成之后,release()一個信號量,才能從LinkedList中取出一個任務(wù)再去執(zhí)行,否則acquire()方法會一直阻塞線程,直到上一個任務(wù)完成。

public class DownUtil{ //定義下載資源的路徑 private String path; //指定下載文件的保存位置 private String targetFile; //定義下載文件的總大小 private int fileSize; //線程池 private ExecutorService mThreadPool; //線程數(shù)量 private static final int DEFAULT_THREAD_COUNT = 5; //任務(wù)隊列 private LinkedList<Runnable> mTasks; //后臺輪詢線程 private Thread mPoolThread; //后臺線程的handler private Handler mPoolThreadHandler; //UI線程的Handler private Handler mUIThreadHandler; //信號量 private Semaphore semaphore; private Semaphore mHandlerSemaphore = new Semaphore(0); //下載線程數(shù)量 private int threadNum; public DownUtil(String path , String targetFile , int threadNum , final ProgressBar bar) {  this.path = path;  this.targetFile = targetFile;  this.threadNum = threadNum;  init();  mUIThreadHandler = new Handler()  {   int sumSize = 0;   @Override   public void handleMessage(Message msg)   {    if (msg.what == 0x123)    {     int size = msg.getData().getInt("upper");     sumSize += size;     Log.d("sumSize" , sumSize + "");     bar.setProgress((int) (sumSize * 1.0 / fileSize * 100));    }   }  }; } private void init() {  mPoolThread = new Thread()  {   public void run()   {    Looper.prepare();    mPoolThreadHandler = new Handler()    {     public void handleMessage(Message msg)     {      if (msg.what == 0x111)      {       mThreadPool.execute(getTask());       try       {        semaphore.acquire();       }       catch (InterruptedException e)       {        e.printStackTrace();       }      }     }    };    mHandlerSemaphore.release();    Looper.loop();   }  };  mPoolThread.start();  mThreadPool = Executors.newFixedThreadPool(DEFAULT_THREAD_COUNT);  mTasks = new LinkedList<>();  semaphore = new Semaphore(DEFAULT_THREAD_COUNT); } public void downLoad() {  try {   URL url = new URL(path);   HttpURLConnection conn = (HttpURLConnection) url.openConnection();   conn.setConnectTimeout(5 * 1000);   conn.setRequestMethod("GET");   conn.setRequestProperty(     "Accept",     "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "       + "application/x-shockwave-flash, application/xaml+xml, "       + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "       + "application/x-ms-application, application/vnd.ms-excel, "       + "application/vnd.ms-powerpoint, application/msword, */*");   conn.setRequestProperty("Accept-Language", "zh-CN");   conn.setRequestProperty("Charset", "UTF-8");   conn.setRequestProperty("Connection", "Keep-Alive");   //得到文件的大小   fileSize = conn.getContentLength();   conn.disconnect();   int currentPartSize = fileSize / threadNum + 1;   RandomAccessFile file = new RandomAccessFile(targetFile , "rw");   file.setLength(fileSize);   file.close();   for (int i = 0 ; i < threadNum ; i++)   {    //計算每條線程下載的開始位置    int startPos = i * currentPartSize;    //每條線程使用一個RandomAccessFile進(jìn)行下載    RandomAccessFile currentPart = new RandomAccessFile(targetFile , "rw");    //定位該線程的下載位置    currentPart.seek(startPos);    //將任務(wù)添加到任務(wù)隊列中    addTask(new DownThread(startPos , currentPartSize , currentPart));   }  }  catch (IOException e)  {   e.printStackTrace();  } } private Runnable getTask() {  if (!mTasks.isEmpty())  {   return mTasks.removeFirst();  }  return null; } private synchronized void addTask(Runnable task) {  mTasks.add(task);  try  {   if (mPoolThreadHandler == null)   {    mHandlerSemaphore.acquire();   }  }  catch (InterruptedException e)  {   e.printStackTrace();  }  mPoolThreadHandler.sendEmptyMessage(0x111); } private class DownThread implements Runnable {  //當(dāng)前線程的下載位置  private int startPos;  //定義當(dāng)前線程負(fù)責(zé)下載的文件大小  private int currentPartSize;  //當(dāng)前線程需要下載的文件塊  private RandomAccessFile currentPart;  //定義該線程已經(jīng)下載的字節(jié)數(shù)  private int length;  public DownThread(int startPos , int currentPartSize , RandomAccessFile currentPart)  {   this.startPos = startPos;   this.currentPartSize = currentPartSize;   this.currentPart = currentPart;  }  @Override  public void run()  {   try   {    URL url = new URL(path);    HttpURLConnection conn = (HttpURLConnection) url.openConnection();    conn.setConnectTimeout(5 * 1000);    conn.setRequestMethod("GET");    conn.setRequestProperty(      "Accept",      "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "        + "application/x-shockwave-flash, application/xaml+xml, "        + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "        + "application/x-ms-application, application/vnd.ms-excel, "        + "application/vnd.ms-powerpoint, application/msword, */*");    conn.setRequestProperty("Accept-Language", "zh-CN");    conn.setRequestProperty("Charset", "UTF-8");    conn.setRequestProperty("Connection", "Keep-Alive");    InputStream inStream = conn.getInputStream();    //跳過startPos個字節(jié)    skipFully(inStream , this.startPos);    byte[] buffer = new byte[1024];    int hasRead = 0;    while (length < currentPartSize && (hasRead = inStream.read(buffer)) > 0)    {     currentPart.write(buffer , 0 , hasRead);     //累計該線程下載的總大小     length += hasRead;    }    Log.d("length" , length + "");    //創(chuàng)建消息    Message msg = new Message();    msg.what = 0x123;    Bundle bundle = new Bundle();    bundle.putInt("upper" , length);    msg.setData(bundle);    //向UI線程發(fā)送消息    mUIThreadHandler.sendMessage(msg);    semaphore.release();    currentPart.close();    inStream.close();   }   catch (Exception e)   {    e.printStackTrace();   }  } } public static void skipFully(InputStream in , long bytes) throws IOException {  long remaining = bytes;  long len = 0;  while (remaining > 0)  {   len = in.skip(remaining);   remaining -= len;  } }}

以下是MainActivity的代碼:

public class MainActivity extends Activity{ EditText url; EditText target; Button downBn; ProgressBar bar; DownUtil downUtil; private String savePath; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  //獲取界面中的四個界面控件  url = (EditText) findViewById(R.id.address);  target = (EditText) findViewById(R.id.target);  try  {   File sdCardDir = Environment.getExternalStorageDirectory();   savePath = sdCardDir.getCanonicalPath() + "/d.chm";  }  catch (Exception e)  {   e.printStackTrace();  }  target.setText(savePath);  downBn = (Button) findViewById(R.id.down);  bar = (ProgressBar) findViewById(R.id.bar);  downBn.setOnClickListener(new View.OnClickListener()  {   @Override   public void onClick(View view)   {    downUtil = new DownUtil(url.getText().toString() , target.getText().toString() , 7 , bar);    new Thread()    {     @Override     public void run()     {      try      {       downUtil.downLoad();      }      catch (Exception e)      {       e.printStackTrace();      }     }    }.start();   }  }); }}

頁面布局比較簡單這里一并貼出:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:text="@string/title1"/> <EditText  android:id="@+id/address"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:text="@string/address"/> <TextView  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:text="@string/targetAddress"/> <EditText  android:id="@+id/target"  android:layout_width="match_parent"  android:layout_height="wrap_content"/> <Button  android:id="@+id/down"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:text="@string/down"/> <!-- 定義一個水平進(jìn)度條,用于顯示下載進(jìn)度 --> <ProgressBar  android:id="@+id/bar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:max="100"  style="?android:attr/progressBarStyleHorizontal"/></LinearLayout>

此例主要是在李剛老師的《瘋狂Java的講義》的多線程的例子上修改,感謝李剛老師,如有不足之處,歡迎批評指正。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
99在线视频首页| 亚洲精品美女久久7777777| 国产伦精品一区二区三区视频黑人| 久久久久国产精品无码免费看| 91日韩在线播放| 成人欧美日韩| 国产高清视频一区二区| 日韩久久中文字幕| 黄色小视网站| 欧美刺激性大交免费视频| 中文字幕第88页| www.国产一区| 久久精品99国产精品日本| 欧美一区二区三区影视| 色婷婷综合久久久久中文| 欧美婷婷久久| 免费观看一区二区三区| 欧美日韩国产美| 亚洲天堂成人在线| 看黄的a网站| 人偷久久久久久久偷女厕| 成人免费黄色在线| 99热超碰在线| 69精品丰满人妻无码视频a片| 亚洲青青青在线视频| 久久国产精品99久久久久久丝袜| 久久久久久久一区二区| 99久久精品费精品国产| 亚洲天天影视| 亚洲国产成人爱av在线播放| √天堂资源地址在线官网| 四虎影院成人| 91国产精品视频在线| 日韩高清电影免费| 欧美精品福利视频| 精品亚洲免费视频| 亚洲国产精品美女| 国产丝袜一区二区三区| 91国偷自产一区二区三区的观看方式| 欧美一区二区视频在线观看2022| 亚洲国产精品国自产拍久久| 日日干夜夜爽| 激情图片qvod| 亚洲国产美女视频| 成人h版在线观看| 全免费a级毛片| 在线观看导航| 水蜜桃色314在线观看| 国产一区二区在线免费播放| 国产精品suv一区二区69| 精品一区中文字幕| 黄色一级片免费看| 亚洲一区二区三区四区精品| 欧美色视频一区二区三区在线观看| 亚洲欧美成aⅴ人在线观看| 欧美精品少妇videofree| 97久久天天综合色天天综合色hd| 97人摸人人澡人人人超一碰| 国产精品对白交换视频| 国产美女视频免费观看下载软件| 国产一区二区免费在线| 欧美精品九九99久久| 欧美日韩三区| 亚洲精品一区二区三区蜜桃久| 性刺激的欧美三级视频| 日本a级片在线播放| 久久99精品这里精品3| 成人国产亚洲欧美成人综合网| av在线电影播放| 综合欧美国产视频二区| 粉嫩av一区二区三区四区五区| aa视频在线免费观看| 超碰在线观看av| 日韩精品一区在线观看| 欧美日韩精品久久| 日本青青草视频| 黄一区二区三区| 你懂的视频欧美| 国产欧亚日韩视频| 久久精彩视频| 日韩午夜电影在线观看| 亚洲黄色片视频| 成人免费看视频网站| 丝袜美腿亚洲一区二区图片| 国产精品久久久久久久久搜平片| 亚洲最大成人网色| 高清国产一区二区三区| 天堂一本之道| 久色乳综合思思在线视频| 中文在线资源天堂| 黄色小说综合网站| 青春草在线视频免费观看| 国产综合色产| 色天天综合色天天久久| 国产精品va在线播放我和闺蜜| 欧美videos另类齐全| 农村黄色一级片| 亚洲成av在线| 青青草免费观看视频| 中文字幕在线视频第一页| 91精品国自产在线观看| 国产精品亚洲αv天堂无码| 欧美日韩视频在线观看一区二区三区| 国产一级黄色| 女同互忝互慰dv毛片观看| 不卡的av电影在线观看| 亚洲欧美999| 中文字幕一区二区三区在线乱码| 69av一区二区三区| 亚洲一区二区三区涩| 国产成人超碰人人澡人人澡| 成人网在线免费视频| 日本桃色视频| 日韩伦理在线| 日本成址在线观看| 中文字字幕在线中文| 国产激情视频一区二区三区| 一本色道69色精品综合久久| 成人免费视频一区二区| 国产免费一区二区三区四在线播放| 亚洲精品国产福利| 男人操女人动态图| 亚洲综合久久久| 97碰碰碰免费公开在线视频| 三级全黄的视频在线观看| 一级片在线播放| 中文字幕一区二区三区人妻不卡| 亚洲精品720p| 成人日韩视频| wwwav网站| 亚洲另类欧美自拍| 国产欧美视频在线| av免费观看网址| 亚洲色图第四色| 日韩欧美亚洲在线| 免费看日韩毛片| 精品久久久久中文慕人妻| 又紧又大又爽精品一区二区| 久久精品二区亚洲w码| 秋霞影院一区二区| 亚洲911精品成人18网站| 免费短视频成人日韩| 欧美h版在线| 91国产精品视频在线观看| 99视频在线免费观看| 久久久久久久久国产| 福利网站在线观看| 欧美福利在线观看| 97久久精品人搡人人玩| 4438亚洲最大| 丰满少妇中文字幕| 最新日韩在线视频| 精品三级国产| 精品久久人人做人人爰| 波多野结衣av在线免费观看| 国产精品色哟哟网站| 色先锋影音岛国av资源| 四虎4545www精品视频| 亚洲国产成人在线播放| 国产日韩精品在线播放| 九色|91porny| 精品无码国产一区二区三区51安| 国产欧美欧洲| 亚洲人精选亚洲人成在线| 国产精品果冻传媒潘| 蜜桃视频污在线观看| 黄色免费视频网站| 在线观看av资源网| 成人免费看的视频| 国产人妻一区二区| 国产综合在线视频| 亚洲人成网在线播放| 亚洲欧美日韩小说| www浪潮av99com| 久久国产视频网| 亚洲黄色一区二区| 久久国产精彩视频| 欧美日韩国产精品自在自线| 揉丰满老妇老女人的毛片| 青青青免费视频观看在线| 国产精欧美一区二区三区白种人| 毛片在线免费播放| 在线播放国产一区中文字幕剧情欧美| 亚洲视频一区二区在线| 羞羞网站在线免费观看| 亚洲精品视频三区| 亚洲另类在线一区| www.欧美日韩国产在线| 北条麻妃在线一区二区免费播放| 中文字幕视频在线播放| 成人av网在线| 欧美日韩午夜爽爽| 日本视频免费观看| 日韩中文字幕亚洲| 第一社区sis001原创亚洲| 亚洲一二三四视频| jizzjizz欧美69巨大| 国产欧美日韩中文字幕在线| 国产aⅴ精品一区二区三区久久| 欧美一区欧美二区| 亚洲男人的天堂在线观看| 6080yy精品一区二区三区| 亚洲国产综合色| xxxxwwww欧美| 国产成人自拍网站| 成人午夜黄色影院| 国产69精品久久777的优势| 国产丝袜一区| 亚洲人成网亚洲欧洲无码| 91在线免费网站| 成年人在线免费观看视频网站| 美女露胸一区二区三区| 成人av电影在线观看| 国产韩日精品| 蜜桃精品wwwmitaows| 成人性生交大片免费看视频在线| 美女国内精品自产拍在线播放| 日韩有吗在线观看| 免费在线观看亚洲| 亚洲黄色三级视频| 国产精品永久在线| 精品一区二区三区免费看| 日韩av在线网页| 国产在线观看免费| 日韩深夜福利网站| 欧美xxxxbb| 永久免费黄色软件| 欧美日韩三级视频| 国产一级免费片| 日韩欧美综合在线视频| 国产人妖ts一区二区| 亚洲图中文字幕| 99国产精品视频免费观看一公开| 亚洲成人第一页| 91精品国产自产拍在线观看蜜| 国产精品毛片一区二区在线看舒淇| 91啦中文在线观看| 婷婷丁香在线| 亚洲国产另类av| 国产白嫩美女无套久久| 性高爱久久久久久久久| 国产1区在线观看| 日日夜夜精品视频| 成人欧美视频在线观看播放| 欧美日韩一区二区国产| 国产麻豆精品一区二区三区v视界| 999福利在线视频| 最近更新在线中文字幕一页| 91激情视频| 国产精品v欧美精品v日韩精品| 亚洲伦在线观看| wwwxxx亚洲| 欧美性猛交xxxx乱大交蜜桃| 国产99re| 中文乱码字幕午夜无线观看| 51亚洲精品| 99热.com| 亚洲福利在线视频| 中文字幕精品在线视频| 国产欧美激情视频| 国产日韩欧美久久| 少妇高潮一区二区三区99| 嫩草影院在线观看网站成人| a天堂在线资源| 999国产精品| 国产视频一区免费看| 一级特黄a大片免费| 国产日韩欧美二区| 超碰在线播放97| 国产精品av网站| 一区二区三区日韩在线观看| 天堂精品在线视频| 欧美美女啪啪| 亚洲精品免费视频| 免费男女羞羞的视频网站中文子暮| 精品欧美一区二区久久久| 深夜福利网站在线观看| 国产伦精品一区二区三区妓女| 久久一区二区三区国产精品| 99riav视频在线观看| 国产成人97精品免费看片| 亚洲国产一区二区三区在线播放| 婷婷亚洲精品| 私人影视中文字幕| 欧美国产日韩一区| 伊人精品久久| 欧美一区二区三区在线观看免费| 9765激情中文在线| 成人国产一区二区三区精品麻豆| 久久久久国产一区二区三区| 欧美一区在线视频| 国产精品网站在线观看| 日本欧美加勒比视频| 精产国产伦理一二三区| 激情久久av| 国产精品嫩草影院俄罗斯| 国产成人无码专区| 国产午夜福利片| 男插女免费视频| 精品婷婷色一区二区三区蜜桃| 国产精久久久| 亚洲欧洲一二三| 91在线高清视频| 一区二区三区网| 精品动漫av| 91精品国产综合久| 99re在线视频精品| 国产资源在线播放| 欧美性活一级视频| 日本韩国一区二区| 欧美精品久久久久a| 黄网址在线观看| 亚洲精品免费在线看| 欧美肥婆xxxx欧美另类| 精品一二三四在线| 国产97在线视频| 色大18成网站www在线观看| 午夜一区在线| 天堂在线免费视频| 91麻豆精品久久毛片一级| 久久精品视频一区二区三区| 日本欧美一二三区| 成年人在线观看视频| 大桥未久一区二区| 日韩一级淫片| 波多野结衣一本一道| 欧美变态口味重另类| 添女人荫蒂视频|