Java 限制多线程下载中的下载速度
我试图限制多线程下载应用程序(如IDM)的下载速度。到目前为止,我是在的帮助下完成这项工作的,但它不起作用,我也不知道为什么。这是我的包装器类: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
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
(如示例中所示)。可能使计数器
不是静态
会更好,但我不明白为什么速度限制
和限制
不应该是静态
,因为所有线程都会检查它们。我不必这样更改所有实例的参数。无论如何,您必须为所有实例提供它们,因为您已经将它们定义为构造函数参数。下定决心吧。如果所有线程都将检查它们,为什么要在构造函数中提供它们?构造函数参数引用实例数据。