为什么使用Threads不能加速我的程序?爪哇

时间:2018-11-09 10:37:37

标签: java multithreading url download threadpool

我对多重处理还很陌生,我想知道在多文件下载中使用它们有多方便。 基本上,我有一个应用程序(可以正常工作,可以从URL下载文件(图像,视频...),我想加快此下载速度(现在它们是顺序的),将它们拆分到多个线程上。因此,我创建了一个类“ PrimeThread” ”覆盖了线程类的run方法,并在每次下载时都在主线程中运行了一个Thread实例,但是我没有注意到时间性能有任何提高。 这是我编写的代码(主要):

                for(int e = 0;e<videos.size();e++) //for every video i create a new thread
                {
                    PrimeThread thread= new PrimeThread(downloader,path1,path2);
                    thread.run();
                }

这是我在Thread类中编写的代码:

 import java.io.IOException;

class PrimeThread extends Thread {
     HttpDownloadUtility scaricatore; //instance of the "downloader" class 
     String path1, path2;
     PrimeThread(HttpDownloadUtility scaricatore,String path1,String path2) {
         this.scaricatore = scaricatore;
         this.path1 = path1;
         this.path2 = path2;
     }

     public void run() {
          try {
            scaricatore.downloadMedia(path1, path2); //method of the "downloader" class that takes 2 paths in input and downloads from the 1st and put the file downloaded in the 2nd path
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
     }
}

1 个答案:

答案 0 :(得分:3)

使用 Thread.start 而不是Thread.run

为了澄清:您执行了PrimeThread.run方法,这只是一个普通方法,它是同步执行的。这意味着,在循环中,下一个“运行”仅在上一个完成后运行。您可以安全地删除“扩展线程”,并且程序可以编译并正常运行。

Thread类的真正“魔术”在方法“ start”中。它由JVM以特殊方式处理。它在OS级别创建一个线程,并开始执行您放入“运行”中的任何代码。

顺便说一句,从Thread类进行扩展并不是一种好习惯。相反,您应该定义要在一个类中运行的代码,该代码实现java.lang.Runnable并使用Thread构造函数new Thread(runnable)。

主循环:

for(int e = 0;e<videos.size();e++) //for every video i create a new thread
{
    Thread thread= new Thread(new PrimeRunnable(downloader,path1,path2));
    thread.start();
}

可运行:

class PrimeRunnable implements Runnable {
    HttpDownloadUtility scaricatore; //instance of the "downloader" class
    String path1, path2;

    PrimeRunnable(HttpDownloadUtility scaricatore,String path1,String path2) {
        this.scaricatore = scaricatore;
        this.path1 = path1;
        this.path2 = path2;
    }

    public void run() {
        try {
            scaricatore.downloadMedia(path1, path2); //method of the "downloader" class that takes 2 paths in input and downloads from the 1st and put the file downloaded in the 2nd path
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}