2014-01-10 2 views
0

Я пишу небольшое приложение, такое как IDM в java. Но у этого есть много Исключений. Это код класса Downloader, который реализует runnable, и я хочу использовать его для многопоточности.Приложение IDM как java

public class Downloader implements Runnable{ 
private DataInputStream inputStream; 
private byte[][] fileData; 
private int index; 
private int size; 

public Downloader(DataInputStream inputStream, byte[][] fileData, int index, int size) { 
    this.inputStream = inputStream; 
    this.fileData = fileData; 
    this.index = index; 
    this.size = size; 
} 

public synchronized void run() { 
    try{ 
     inputStream.skipBytes(index * size); 
     for(int i= 0;i<size;i++){ 
      fileData[index][i] = inputStream.readByte(); 
      System.out.println("It works : " + index); 
     } 
    } 
    catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
}} 

и это мой основной класс

public class Main { 

public static void main(String[] args) { 
    String s; 
    //Scanner input = new Scanner(System.in); 
    //System.out.print("Enter file destination : "); 
    //s = input.nextLine(); 
    s = "http://video.varzesh3.com/video/clip1/92/uclip/fun/gaf_6_borhani.mp4"; 
    URL url; 
    URLConnection connection; 
    DataInputStream inputStream; 
    FileOutputStream outStream; 
    byte[][] fileData; 
    try{ 
     url = new URL(s); 
     connection = url.openConnection(); 
     inputStream = new DataInputStream(connection.getInputStream()); 
     fileData = new byte[8][connection.getContentLength()/4]; 
     int size = connection.getContentLength()/4; 
     Runnable d0 = new Downloader(inputStream, fileData, 0, size); 
     Runnable d1 = new Downloader(inputStream, fileData, 1, size); 
     Runnable d2 = new Downloader(inputStream, fileData, 2, size); 
     Runnable d3 = new Downloader(inputStream, fileData, 3, size);    
     Thread thread0 = new Thread(d0); 
     Thread thread1 = new Thread(d1); 
     Thread thread2 = new Thread(d2); 
     Thread thread3 = new Thread(d3);    
     thread0.start(); 
     thread1.start(); 
     thread2.start(); 
     thread3.start();    
     inputStream.close(); 
     String path = "C:\\Users\\NetTest\\Desktop\\test.mp4"; 
     outStream = new FileOutputStream(new File(path)); 
     outStream.write(fileData[0]); 
     /*outStream.write(fileData[1]); 
     outStream.write(fileData[2]); 
     outStream.write(fileData[3]); 
     outStream.write(fileData[4]); 
     outStream.write(fileData[5]); 
     outStream.write(fileData[6]); 
     outStream.write(fileData[7]);*/ 
     outStream.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
}} 

но когда я запускаю его это происходит

It works: 0 
null 
null 
null 
null 

Что мне теперь делать?

+0

Попробуйте запустить однопоточный. – kukido

+0

Я думаю, вам не хватает того факта, что, как только первый поток читает байты, эти байты удаляются из буфера. Это поток, а не буфер. Точно так же, как с потоками воды, когда-то что-то прошло, оно исчезло навсегда. – CodeChimp

ответ

1

В вашем коде 2 проблемы.

  1. В текущем состоянии вы close()InputStream, из которого все Thread пытаются прочитать непосредственно после того, как вы начали их (-> в то время как они работают). Для решения этой проблемы вы можете вызвать метод join() класса Thread. В вашем случае вы должны позвонить ему для всех 4 Threads, чтобы убедиться, что они закончены.

  2. Если я правильно понял, вы хотите разделить загрузку File на 4 части, загружаемых в одно и то же время.

Для этого вам необходимо 4 независимых InputStreams. (В настоящее время вы используете один [Смотрите также: Java Object Copying])

Таким образом, чтобы изменить ваш код будет выглядеть примерно так:

public class Downloader implements Runnable{ 
    private byte[][] fileData; 
    private int index; 
    private int size; 
    private URL url; 

    public Downloader(URL url, byte[][] fileData, int index, int size) { 
    this.fileData = fileData; 
    this.index = index; 
    this.size = size; 
    this.url = url; 
    } 

    public synchronized void run() { 
    try{ 
     URLConnection connection = url.openConnection(); 
     DataInputStream inputStream = new DataInputStream(connection.getInputStream()); 
     inputStream.skipBytes(index * size); 
     for(int i= 0;i<size;i++){ 
     fileData[index][i] = inputStream.readByte(); 
     System.out.println("It works : " + index); 
     } 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
    } 
} 
Смежные вопросы