首页 > 编程知识 正文

java多线程下载源码(多线程编程java)

时间:2023-12-09 23:12:00 阅读:313993 作者:UIYX

本文目录一览:

追分!!48小时内急求多线程下载代码JAVA,在原有代码基础上改进即可

你这个是很难的

服务端要同时为很多客户工作的话,简单的设计就是使用多线程,每个线程为一个客户工作。客户端通常不需要特别多的线程,但是一般也需要一个工作线程负责和服务端的协议处理,一个界面的线程,否则如果网络阻塞,用户的体验会很不好(界面总是卡壳)。当然简单学习的话,客户端用单线程也是可以的。

例子代码很多Java编程的书里都有,可以在网上搜索一下。推荐还是去下载一本Java网络编程的电子书吧,不然光看实例源代码,一些基本概念和处理方法不太容易明白为什么要这样做的。

求java多线程下载工具的源程序!

java实现多线程可以继承Thread类,也可以通过实现Runnable接口实现。下面是以池塘放水演示多线程的例子:

package Thread;

class Water{//水塘类

static Object water=new Object();

static int total=6;//假设水塘总共可以含水量为6

static int mqsl=3;//假设水塘中拥有含水量为3

static int ps=0;//假设水塘目前排水量为0

}

class ThreadA extends Thread{//排水类

void pswork(){

synchronized(Water.water){

System.out.println("水塘是否没有水: "+isEmpty());

if(isEmpty()){

try{

Water.water.wait();

}catch(InterruptedException e){

e.printStackTrace();

}

}

else{

Water.ps++;

System.out.println("水塘目前排水水量 "+Water.ps);

}

//System.out.println("Water.ps"+Water.ps);

}

}

public void run(){

while(Water.mqslWater.total){

if(isEmpty())

System.out.println("水塘目前没有水,排水线程被挂起");

System.out.println("排水工作开始");

pswork();

try{

sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

public boolean isEmpty(){

return Water.mqsl==Water.ps?true:false;

}

}

class ThreadB extends Thread{//进水类

void jswork(){

synchronized(Water.water){

Water.mqsl++;//假设水塘每小时进水量为1

Water.water.notify();

System.out.println("水塘目前进水量为 "+Water.mqsl);

}

}

public void run(){

while(Water.mqslWater.total){

System.out.println("进水工作开始");

jswork();

try{

sleep(3000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

public class PoolPattern {

public static void main(String[] args) {

// TODO 自动生成方法存根

ThreadA threadA=new ThreadA();

ThreadB threadB=new ThreadB();

threadB.start();

threadA.start();

}

}

运行结果:

进水工作开始

排水工作开始

水塘目前进水量为 4

水塘是否没有水: false

水塘目前排水水量 1

排水工作开始

水塘是否没有水: false

水塘目前排水水量 2

排水工作开始

水塘是否没有水: false

水塘目前排水水量 3

进水工作开始

水塘目前进水量为 5

排水工作开始

水塘是否没有水: false

水塘目前排水水量 4

排水工作开始

水塘是否没有水: false

水塘目前排水水量 5

水塘目前没有水,排水线程被挂起

排水工作开始

水塘是否没有水: true

进水工作开始

水塘目前进水量为 6

java多线程下载的问题请教。

你书上的code和 这个网址上的一样么?

如果一样的话,那么我觉得这么做的目的应该是:

fileSize/threadNum 的结果是四舍五入之后的结果,如果是舍去了一部分,那么按照这个网址上的code到最后就会有一点没有下载。所以它另每个filtePart的大小都增大1,并且在DownThread里面加入了另外一个条件:

length currentPartSize (hasRead = inStream.read(buffer)) 0

就可以保证在文件的末尾,停止读操作。

java 怎样实现多线程下载的

java多线程机制: 例子1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand(); //创建两个线程。 right=new Righthand(); left.start(); right.start(); } } class Lefthand extends Thread { public void run() { for(int I=0;I=5;I++) { System.out.println("I am a student"); try{sleep(500);} catch(InterruptedException e){} } } } class Righthand extends Thread { public void run() { for(int I=0;I=5;I++) { System.out.println("I am oookkk"); try{sleep(300);} catch(InterruptedException e){} } } } 在上述例子中,我们在main主线程中创建了两个新的线程lefthand和righthand。当lefthand调用start()开始运行时,类Lefthand中的run()将自动被执行。 我们来分析一下上面程序的输出结果。Left线程首先开始执行,这时Lefthand类中的run方法开始执行,输出”I am a student”后,left主动“休息”500毫秒,让出了CPU。这时正在排队等待CPU的right线程的run方法马上被执行,输出“I am ookk”,right在主动让出CPU300毫秒后又来排队等待CPU服务,这时right发现left还没有“醒来”,即没有来排队抢占CPU,因此left的run方法被执行,又输出“I am oookkk“……。程序的执行结果是: E:ddjava Example1 I am student I am oookkk I am oookkk I am student I am oookkk I am oookkk I am student I am oookkk I am student I am oookkk I am student I am student 2.实现Runnable接口 例子2 import java.applet.*; import java.awt.*; public class Example2 extends java.applet.Applet implements Runnable { Thread circleThread; public void start() { if (circleThread==null) { circleThread=new Thread(this); circleThread.start(); } } public void run() { while(circleThread !=null) { repaint(); try{ circleThread.sleep(1000); } catch(InterruptedException e){} } } public void paint(Graphics g) { double i=Math.random(); if(i0.5) g.setColor(Color.red); else g.setColor(Color.blue); g.fillOval(100,100,(int)(100*i),(int)(100*i)); } public void stop() { circleThread.yield(); circleThread=null; } } 在上述例子2中,我们在小程序这个主线程中用构造方法Thread(this)创建了一个新的线程。This代表着小程序作为这个新的线程的目标对象,因此我们的小程序必须为这个新创建的线程实现Runnable接口,即小程序利用Runnable接口为其中创建的这个新线程提供run()方法,给出该线程的操作。 首先,在小程序的start()方法中构造了一个名为circleThread的线程并调用线程类的start()方法来启动这一线程,即在小程序的主线程中又开始了一个线程:circleThread。下面的语句建立了一个新的线程: circlethread =new Thread(this); 其中this作为该线程的目标对象,它必须实现Runnable接口。线程被启动以后,自动调用目标对象的run()方法,除非线程被停止。在run()方法的第十一中,Applet重绘本身,然后睡眠1秒,同时要捕获异常事件并进行处理。 如果你离开这一页,程序将调用stop()方法,将线程置空。当你返回时,又会创建一个新的线程。在具体应用中,采用哪种方法来构造线程体要视具体情况而定。通常,当一个新的线程已继承了另一个类,而想在该线程中创建一个新的线程时,就应该用第二种方法来构造,即实现Rennable接口。 需要理解的是,我们的小应用程序实际上是浏览器的一个线程,这个线程由浏览器启动执行,浏览器自动调用执行小程中的init()、start()方法等。因此我们要创建一个新的线程最好把新线程的启动放在小程序的start()方法中。 下面的例子3是一个应用程序,这个应用程序在创建窗口的同时又创建了一个新的线程,该线程负责让窗口中的一个按钮改变它的大小。 例子3 import java.awt.*; import java.awt.event.*; public class Example3 { public static void main(String args[]) { Mywin win=new Mywin(); win.pack(); } } class Mywin extends Frame implements Runnable { Button b=new Button("ok"); int x=5; Thread bird=null; Mywin() { setBounds(100,100,120,120); setLayout(new FlowLayout()); setVisible(true); add(b); b.setBackground(Color.green); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); bird=new Thread(this); //创建一个新的线程,窗口做目标对象, //替线程bird实现接口Runnable。 bird.start(); //在创建窗口时又开始了线程dird. } public void run() { while(true) { x=x+1; if(x100) x=5; b.setBounds(40,40,x,x); try{bird.sleep(200);} catch(InterruptedException e){} } } } 滚动字幕线程。 例子4 import java.applet.*; import java.awt.*; public class Example4 extends java.applet.Applet implements Runnable { int x=0; Thread Scrollwords=null; public void init() { setBackground(Color.cyan); setForeground(Color.red); setFont(new Font("TimesRoman",Font.BOLD,18)); } public void start() { if(Scrollwords==null) { Scrollwords=new Thread(this); Scrollwords.start(); } } public void run() { while (Scrollwords!=null) { x=x+5; if(x500) x=0; repaint(); try{Scrollwords.sleep(80);} catch(InterruptedException e){} } } public void paint(Graphics g) { g.drawString("欢迎使用字典 ",x ,80); } public void stop() { Scrollwords.yield(); Scrollwords=null; } } 带滚动字幕的小字典。 例子5 import java.applet.*; import java.awt.*; import java.awt.event.*; public class Example5 extends Applet implements ActionListener,Runnable { TextField text1,text2; int x=0; Thread Scrollwords=null; public void init() { setBackground(Color.cyan); setForeground(Color.red); setFont(new Font("TimesRoman",Font.BOLD,18)); text1=new TextField(10); text2=new TextField(10); add(new Label("输入一个英文单词:")); add(text1); add(new Label("汉语意思:")); add(text2); text1.addActionListener(this); } public void start() { if(Scrollwords==null) { Scrollwords=new Thread(this); Scrollwords.start(); } } public void run() { while (Scrollwords!=null) { x=x+5; if(x500) x=0; repaint(); try{Scrollwords.sleep(80);} catch(InterruptedException e){} } } public void paint(Graphics g) { g.drawString("欢迎使用字典 ",x ,120); } public void stop() { Scrollwords.yield(); Scrollwords=null; } public void actionPerformed(ActionEvent e) { if((e.getSource()==text1)(text1.getText().equals("boy"))) { text2.setText("男孩"); } else if((e.getSource()==text1)(text1.getText().equals("sun"))) { text2.setText("太阳"); } else { text2.setText("没有该单词"); } } } 下面是一个左手画圆右手画方的例子。我们在主线程中创建了两个线程:left、right,其中一个负责画圆,另一个负责画方。在这个例子中我们使用了容器类的方法getGraphics()来获取一个Graphics对象(可以理解为一个画笔)。 例子6 (效果如图1所示) 图1 双线程绘画程序 import java.applet.*; import java.awt.*; import java.awt.event.*; public class Example6 extends Applet implements Runnable { Thread left,right; Graphics mypen; int x,y; public void init() { left=new Thread(this); right=new Thread(this); x=10; y=10; mypen=getGraphics(); } public void start() { left.start(); right.start(); } public void run() { while(true) if (Thread.currentThread()==left) { x=x+1; if(x240) x=10; mypen.setColor(Color.blue); mypen.clearRect(10,10,300,100); mypen.drawRect(10+x,10,50,50); try{left.sleep(60);} catch(InterruptedException e){} } else if(Thread.currentThread()==right) { y=y+1; if(y240) y=10; mypen.setColor(Color.red); mypen.clearRect(10,110,300,100); mypen.drawOval(10+y,110,50,50); try{right.sleep(60);} catch(InterruptedException e){} } } public void stop() { left=null; right=null; } }

Java语言多线程下载不同文件

这个其实很简单,重要的就是要建立 线程类,包含下载文件地址参数,以及具体下载配置,如果是ftp的话;

在一个就是构建线程池对下载的数量分配。具体的可以自己尝试开发下,别人咀嚼过的永远没有味道 ,即便给你标注好注释,过一阵子你也会忘记。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。