本文目錄一覽:
- 1、追分!!48小時內急求多線程下載代碼JAVA,在原有代碼基礎上改進即可
- 2、求java多線程下載工具的源程序!
- 3、java多線程下載的問題請教。
- 4、java 怎樣實現多線程下載的
- 5、Java語言多線程下載不同文件
追分!!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的話;
在一個就是構建線程池對下載的數量分配。具體的可以自己嘗試開發下,別人咀嚼過的永遠沒有味道 ,即便給你標註好注釋,過一陣子你也會忘記。
原創文章,作者:MLGWC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317554.html