Java 限制多线程下载中的下载速度

Java 限制多线程下载中的下载速度,java,multithreading,stream,Java,Multithreading,Stream,我试图限制多线程下载应用程序(如IDM)的下载速度。到目前为止,我是在的帮助下完成这项工作的,但它不起作用,我也不知道为什么。这是我的包装器类: public class DownloadStream { InputStream in; long timestamp; static int counter = 0; static int INTERVAL = 1000; static int LIMIT; static boolean speedL

我试图限制多线程下载应用程序(如IDM)的下载速度。到目前为止,我是在的帮助下完成这项工作的,但它不起作用,我也不知道为什么。这是我的包装器类:

public class DownloadStream
{
    InputStream in;
    long timestamp;
    static int counter = 0;
    static int INTERVAL = 1000;
    static int LIMIT;
    static boolean speedLimited;

    public DownloadStream(InputStream stream, boolean speedLimited, int kbytesPerSecond)
    {
        LIMIT = kbytesPerSecond * 1000;
        this.speedLimited = speedLimited;
        in = stream;
    }

    public int read(byte[] buffer) throws IOException
    {
        if(!speedLimited)
            return in.read(buffer);

        check();

        int res = in.read(buffer);
        if (res >= 0) {
            counter += res;
        }
        return res;
    }

    public synchronized void check()
    {
        if (counter > LIMIT)
        {
            long now = System.currentTimeMillis();
            if (timestamp + INTERVAL >= now) {
                try
                {
                    Thread.sleep(timestamp + INTERVAL - now);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            timestamp = now;
            counter -= LIMIT;
        }
    }
}
我在我的每个下载线程中都像使用
InputStream
一样使用它:

byte[] buffer = new byte[4096];
while((length = input.read(buffer)) != -1)
{
    output.write(buffer,0,length);
}

如果输入1作为8个线程的
kbytesPerSecond
,下载速度将提高到每秒16千字节。我将
计数器设置为静态以防止出现这种情况,但它不起作用。

您似乎没有初始化
时间戳,所以
(时间戳+间隔>=now)
总是错误的。@VictorOrokin我看到了,但在那之后有一条语句
时间戳=now
。所以我不认为这是问题所在。在多线程应用程序中,将随机场设为静态永远不会起作用。除了INTERVAL之外,这些字段都不应该是静态的,而INTERVAL应该是最终的。您应该使这个类扩展
FilterInputStream
,以使其更可用。@EJP我试图首先使所有非
static
(如示例中所示)。可能使
计数器
不是
静态
会更好,但我不明白为什么
速度限制
限制
不应该是
静态
,因为所有线程都会检查它们。我不必这样更改所有实例的参数。无论如何,您必须为所有实例提供它们,因为您已经将它们定义为构造函数参数。下定决心吧。如果所有线程都将检查它们,为什么要在构造函数中提供它们?构造函数参数引用实例数据。您似乎没有初始化
timestamp
,因此
(timestamp+INTERVAL>=now)
始终为false。@VictorSorokin我看到了,但之后有一条语句
timestamp=now
。所以我不认为这是问题所在。在多线程应用程序中,将随机场设为静态永远不会起作用。除了INTERVAL之外,这些字段都不应该是静态的,而INTERVAL应该是最终的。您应该使这个类扩展
FilterInputStream
,以使其更可用。@EJP我试图首先使所有非
static
(如示例中所示)。可能使
计数器
不是
静态
会更好,但我不明白为什么
速度限制
限制
不应该是
静态
,因为所有线程都会检查它们。我不必这样更改所有实例的参数。无论如何,您必须为所有实例提供它们,因为您已经将它们定义为构造函数参数。下定决心吧。如果所有线程都将检查它们,为什么要在构造函数中提供它们?构造函数参数引用实例数据。