多线程下载(Android多线程下载)
目前应该是有很多小伙伴对于多线程下载方面的信息比较感兴趣,现在小编就收集了一些与Android多线程下载相关的信息来分享给大家,感兴趣的小伙伴可以接着往下看,希望会帮助到你哦。
什么是多线程下载?谢谢!!!
展开1全部
简单地说,多线程下载技术就是使用多个连接分别下载软件不同部分的下载方式。多线程下载技术最大的优点就是能够充分地利用调制解调器的数据传输能力,从而达到在最短的时间内将一个软件下载过来的目的。
通常可供下载软件的服务器分配给每个连接的数据带宽是一定的,如果这个带宽比调制解调器的带宽大,那么单个的连接也能够满足调制解调器的数据接收需求而使下载速度达到最大。但是实际上,服务器分配给每个连接的带宽通常要小于调制解调器的数据吞吐能力,因此常常出现宽路跑单车的现象。虽然调制解调器的数据接收指示灯是亮着的,但是实际上传进来的数据流密度却很小。
如果把单线程下载比作采用单车运货,那么多线程下载工具就相当于一个车队。开始下载过程以后,这个车队的每台车装载软件的不同部分,然后同时往回开。由于调制解调器提供的路足够宽,所以这些车能够并排地开回来,这样跑一回就可以将软件全部装回来了。从实际过程来看,既然服务器分配给每个连接的带宽是有限的,那么我争取几个连接来下载同一个软件的不同部分,就相当于扩大了下载过程所能够使用的带宽。所以,多线程下载节省的时间常常以几倍计,具体表现就是下载的速度相当快。例如网络蚂蚁的最新版本,采用5个线程、使用56K调制解调器来下载,在不限制数据流量的情况下,通常能够达到7K每秒的下载速度。
也许大家会认为,网络蚂蚁所使用的多线程技术简直就是多线程下载技术的极致了,其实不然。这种多线程下载技术离真正的多线程下载技术的极点还有一段距离呢!
通过简单的分析就不难明白这一点。
网络蚂蚁的多线程都是针对同一个服务器的,确定了下载链接指向的服务器并建立了连接以后,几只蚂蚁到软件所在的同一个服务器上分别去拥抱要下载的软件的不同部分,然后再往用户的计算机中拖。这种下载方式有一个致命的弱点,就是一旦这个目标服务器出现繁忙,那么无论是几只蚂蚁,其工作都将受到影响,导致整个下载速度变慢。网络蚂蚁使用的这种多线程技术实际上是一种单目标的多线程技术。
真正高级的多线程下载技术,是从不同的服务器上下载同一个软件的不同部分,这种多线程技术可以称为多目标多线程技术。采用这种最新的多线程下载技术,即使众多的目标服务器中以一个或者几个临时遇到繁忙,其余的服务器依旧能够提供较高的下载速度,而当速度较快的线程结束下载的时候,原来繁忙的服务器就可能空闲下来,这时相应的线程就可以充分利用调制解调器已经变得宽裕的带宽资源高速下载。
显然,多目标多线程下载技术要比但目标多线程下载技术在档次上高一个级别,在实际使用中更便于保证提供较高的下载速度。
参考资料:
?tid-41048.html
本回答由提问者推荐
java 怎样实现多线程下载的
展开1全部
java多线程机制:例子1publicclassExample1{staticLefthandleft;staticRighthandright;publicstaticvoidmain(Stringargs[]){left=newLefthand();//创建两个线程。right=newRighthand();left.start();right.start();}}classLefthandextendsThread{publicvoidrun(){for(intI=0;I<=5;I++){System.out.println("Iamastudent");try{sleep(500);}catch(InterruptedExceptione){}}}}classRighthandextendsThread{publicvoidrun(){for(intI=0;I<=5;I++){System.out.println("Iamoookkk");try{sleep(300);}catch(InterruptedExceptione){}}}}在上述例子中,我们在main主线程中创建了两个新的线程lefthand和righthand。当lefthand调用start()开始运行时,类Lefthand中的run()将自动被执行。我们来分析一下上面程序的输出结果。Left线程首先开始执行,这时Lefthand类中的run方法开始执行,输出”Iamastudent”后,left主动“休息”500毫秒,让出了CPU。这时正在排队等待CPU的right线程的run方法马上被执行,输出“Iamookk”,right在主动让出CPU300毫秒后又来排队等待CPU服务,这时right发现left还没有“醒来”,即没有来排队抢占CPU,因此left的run方法被执行,又输出“Iamoookkk“……。程序的执行结果是:E:\dd>javaExample1IamstudentIamoookkkIamoookkkIamstudentIamoookkkIamoookkkIamstudentIamoookkkIamstudentIamoookkkIamstudentIamstudent2.实现Runnable接口例子2importjava.applet.*;importjava.awt.*;publicclassExample2extendsjava.applet.AppletimplementsRunnable{ThreadcircleThread;publicvoidstart(){if(circleThread==null){circleThread=newThread(this);circleThread.start();}}publicvoidrun(){while(circleThread!=null){repaint();try{circleThread.sleep(1000);}catch(InterruptedExceptione){}}}publicvoidpaint(Graphicsg){doublei=Math.random();if(i<0.5)g.setColor(Color.red);elseg.setColor(Color.blue);g.fillOval(100,100,(int)(100*i),(int)(100*i));}publicvoidstop(){circleThread.yield();circleThread=null;}}在上述例子2中,我们在小程序这个主线程中用构造方法Thread(this)创建了一个新的线程。This代表着小程序作为这个新的线程的目标对象,因此我们的小程序必须为这个新创建的线程实现Runnable接口,即小程序利用Runnable接口为其中创建的这个新线程提供run()方法,给出该线程的操作。首先,在小程序的start()方法中构造了一个名为circleThread的线程并调用线程类的start()方法来启动这一线程,即在小程序的主线程中又开始了一个线程:circleThread。下面的语句建立了一个新的线程:circlethread=newThread(this);其中this作为该线程的目标对象,它必须实现Runnable接口。线程被启动以后,自动调用目标对象的run()方法,除非线程被停止。在run()方法的第十一中,Applet重绘本身,然后睡眠1秒,同时要捕获异常事件并进行处理。如果你离开这一页,程序将调用stop()方法,将线程置空。当你返回时,又会创建一个新的线程。在具体应用中,采用哪种方法来构造线程体要视具体情况而定。通常,当一个新的线程已继承了另一个类,而想在该线程中创建一个新的线程时,就应该用第二种方法来构造,即实现Rennable接口。需要理解的是,我们的小应用程序实际上是浏览器的一个线程,这个线程由浏览器启动执行,浏览器自动调用执行小程中的init()、start()方法等。因此我们要创建一个新的线程最好把新线程的启动放在小程序的start()方法中。下面的例子3是一个应用程序,这个应用程序在创建窗口的同时又创建了一个新的线程,该线程负责让窗口中的一个按钮改变它的大小。例子3importjava.awt.*;importjava.awt.event.*;publicclassExample3{publicstaticvoidmain(Stringargs[]){Mywinwin=newMywin();win.pack();}}classMywinextendsFrameimplementsRunnable{Buttonb=newButton("ok");intx=5;Threadbird=null;Mywin(){setBounds(100,100,120,120);setLayout(newFlowLayout());setVisible(true);add(b);b.setBackground(Color.green);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});bird=newThread(this);//创建一个新的线程,窗口做目标对象,//替线程bird实现接口Runnable。bird.start();//在创建窗口时又开始了线程dird.}publicvoidrun(){while(true){x=x+1;if(x>100)x=5;b.setBounds(40,40,x,x);try{bird.sleep(200);}catch(InterruptedExceptione){}}}}滚动字幕线程。例子4importjava.applet.*;importjava.awt.*;publicclassExample4extendsjava.applet.AppletimplementsRunnable{intx=0;ThreadScrollwords=null;publicvoidinit(){setBackground(Color.cyan);setForeground(Color.red);setFont(newFont("TimesRoman",Font.BOLD,18));}publicvoidstart(){if(Scrollwords==null){Scrollwords=newThread(this);Scrollwords.start();}}publicvoidrun(){while(Scrollwords!=null){x=x+5;if(x>500)x=0;repaint();try{Scrollwords.sleep(80);}catch(InterruptedExceptione){}}}publicvoidpaint(Graphicsg){g.drawString("欢迎使用字典",x,80);}publicvoidstop(){Scrollwords.yield();Scrollwords=null;}}带滚动字幕的小字典。例子5importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassExample5extendsAppletimplementsActionListener,Runnable{TextFieldtext1,text2;intx=0;ThreadScrollwords=null;publicvoidinit(){setBackground(Color.cyan);setForeground(Color.red);setFont(newFont("TimesRoman",Font.BOLD,18));text1=newTextField(10);text2=newTextField(10);add(newLabel("输入一个英文单词:"));add(text1);add(newLabel("汉语意思:"));add(text2);text1.addActionListener(this);}publicvoidstart(){if(Scrollwords==null){Scrollwords=newThread(this);Scrollwords.start();}}publicvoidrun(){while(Scrollwords!=null){x=x+5;if(x>500)x=0;repaint();try{Scrollwords.sleep(80);}catch(InterruptedExceptione){}}}publicvoidpaint(Graphicsg){g.drawString("欢迎使用字典",x,120);}publicvoidstop(){Scrollwords.yield();Scrollwords=null;}publicvoidactionPerformed(ActionEvente){if((e.getSource()==text1)&&(text1.getText().equals("boy"))){text2.setText("男孩");}elseif((e.getSource()==text1)&&(text1.getText().equals("sun"))){text2.setText("太阳");}else{text2.setText("没有该单词");}}}下面是一个左手画圆右手画方的例子。我们在主线程中创建了两个线程:left、right,其中一个负责画圆,另一个负责画方。在这个例子中我们使用了容器类的方法getGraphics()来获取一个Graphics对象(可以理解为一个画笔)。例子6(效果如图1所示)图1双线程绘画程序importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassExample6extendsAppletimplementsRunnable{Threadleft,right;Graphicsmypen;intx,y;publicvoidinit(){left=newThread(this);right=newThread(this);x=10;y=10;mypen=getGraphics();}publicvoidstart(){left.start();right.start();}publicvoidrun(){while(true)if(Thread.currentThread()==left){x=x+1;if(x>240)x=10;mypen.setColor(Color.blue);mypen.clearRect(10,10,300,100);mypen.drawRect(10+x,10,50,50);try{left.sleep(60);}catch(InterruptedExceptione){}}elseif(Thread.currentThread()==right){y=y+1;if(y>240)y=10;mypen.setColor(Color.red);mypen.clearRect(10,110,300,100);mypen.drawOval(10+y,110,50,50);try{right.sleep(60);}catch(InterruptedExceptione){}}}publicvoidstop(){left=null;right=null;}}
本回答由提问者推荐
Java 多线程下载程序项目
多点下载=多线程下载?
本文结束,以上,就是多线程下载,Android多线程下载的全部内容了,如果大家还想了解更多,可以关注我们哦。
相关文章
- 详细阅读
-
? :一手车卖给了二手车商,成交后第二天说车子是事故车,说隐瞒事实?详细阅读
我一手车卖给了二手车商,成交后第二天说车子是事故车,说我隐瞒事实,要求全款退车,我该怎么办? 报警处理。二手车行在车辆鉴定方面是内行,买车人在车辆鉴定...
2022-08-16 2090
-
搞笑短视频题材 :个人短视频槽点题材如何构思?详细阅读
我们反过来看一些搞笑的账号,这些账号虽然粉丝不少,内容也很不错,但是关注搞笑账号的用户,大多数都是为了开心的,所以这样的粉丝群体自然就很难变现。所以我...
2022-08-16 2605
-
91短视频版ios :有哪些苹果手机上能用,你又不愿意让人知道的好用的app呢?详细阅读
在苹果手机中使用的软件,在不越狱的情况下,大多数人都是在苹果商店上下载软件。 但是还有其他的方法可以让你的手机中安装上在苹果商店中没有的软件。 有两个...
2022-08-16 2025
-
短视频作品怎么发 :抖音如何发长视频完整版?详细阅读
抖音是我们熟知的一款非常火爆的短视频软件,在抖音上可以浏览别人的作品,也可以发布自己的作品,那么自己发布作品的时候想要发长视频,怎么发呢?一起来看一下...
2022-08-16 1922
-
短视频用户行为分析 :据说中国近八成手机网民是短视频用户,侵权问题如何解决?详细阅读
侵权这个问题在如今这个自媒体泛滥的时代不好精准定位。 因为一个好的题材自己发布出去可能只需要短短的几分钟时间就能够引起火爆。 平台的大数据根本无法做...
2022-08-16 1597
-
91短视频ios :苹果手机除了app store,还能在哪里下载软件?包括一些破解软件?详细阅读
苹果手机,下载软件,好像只能在苹果手机自带的APP STORE下载吧?我自己从来没有尝试过在其他地方下载,在越狱最火热的年份,我也没有尝试过越狱。 2...
2022-08-16 1410
-
富二代富二代短视频 :为什么现在富二代比穷二代努力?详细阅读
大家好这里是二次元胡辣汤。酸爽可口。 看到这个问题我首先想到了马太效应。富者更富,穷者更穷。这也是一个不争的事实。但是不否认那些努力的年轻人。 富二...
2022-08-16 1423
发表评论