java多線程下載源碼(多線程編程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-hant/n/317554.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MLGWC的頭像MLGWC
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論