当前位置: 首页 > 知识库问答 >
问题:

Java:URLConnection setRequestProperty是否依赖于多线程进程?

姜松
2023-03-14
Task Runnable ID = 0 --> Requested Range Property = {Range=[bytes=0-93969]}

Task Runnable ID = 1 --> Resquested Range Property = {Range=[bytes=93970-187939]}

Task Runnable ID = 2 --> Requested Range Property = {Range=[bytes=187940-281909]}

Task Runnable ID = 3 --> Resquested Range Property = {Range=[bytes=281910-375883]}

Task Runnable ID = 0 --> InputStream Lenght = 93970 / StartByte = 0 / CurrentByte = 0 / EndByte = 93969

Task Runnable ID = 1 --> InputStream Length = 375883 / StartByte = 93970 / CurrentByte = 93970 / EndByte = 187939

Task Runnable ID = 3 --> InputStream Length = 375883 / StartByte = 281910 / CurrentByte = 281910 / EndByte = 375883

Task Runnable ID = 2 --> InputStream Length = 375883 / StartByte = 187940 / CurrentByte = 187940 / EndByte = 281909
public class TaskRunnable implements Runnable {

    private static final int    BUFFER_SIZE     = 4092;

    private long                startByte;
    private long                currentByte;
    private long                endByte;


    private Task                task;
    private static int          idCounter       = 0;
    private int                 id;

    @SuppressWarnings("unused")
    private TaskRunnable() {
    }

    public TaskRunnable(Task task, long startByte, long endByte) {
        this.startByte = startByte;
        this.endByte = endByte;
        this.task = task;
        this.currentByte = startByte;
        this.id = idCounter++;
    }

    @Override
    public void run() {
        Thread.currentThread().setName("Download Runnable");

        Authenticator authenticator = task.getManager().getAuthenticator();
        if (authenticator != null) {
            Authenticator.setDefault(authenticator);
        }

        File targetFile;
        synchronized (this) {
            targetFile = new File(task.getTargetFile().getAbsolutePath());
        }

        BufferedInputStream bufferedInputStream = null;
        byte[] buf = new byte[BUFFER_SIZE];
        URLConnection urlConnection = null;
        try {
            URL _url = new URL(task.getSourceFileUrl().toString());
            Proxy proxy = task.getManager().getProxy();
            if (proxy != null) {
                urlConnection = _url.openConnection(proxy);
            } else {
                urlConnection = _url.openConnection();
            }
            urlConnection.setRequestProperty("Range", "bytes=" + currentByte + "-" + endByte);
            System.out.println("Task Runnable ID = " + id + " --> Requested Range Property = " + urlConnection.getRequestProperties().toString());

            bufferedInputStream = new BufferedInputStream(urlConnection.getInputStream());
            int len = 0;
            while (bufferedInputStream.read() != -1) {
                len++;
            }
            System.out.println("Task Runnable ID = " + id + " --> InputStream Length = " + len + " / StartByte = " + startByte + " / CurrentByte = " + currentByte + " / EndByte = " + endByte);

            bufferedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意:如果使用相同的代码,但基于单线程,所有的运行都很好。

共有1个答案

呼延高超
2023-03-14

我怀疑内部URLConnection状态发生了并发修改。您是否尝试调用URLConnection.SetUseCaches(false)

更新

影响URLConnection对象可能重用的另一个全局缓存是ResponseCache。您应该在初始化时禁用它,方法是执行

ResponseCache.setDefault(null);
 类似资料:
  • 问题内容: 我找不到golang依赖于c运行时的信息吗?如果依赖它,它是否会在go-binary中静态编译以使Go-app可以在任何地方工作而无需依赖? 这是有关什么是C运行时的主题 libcmt是Microsoft编译器提供的C标准库的(几种)实现。它们提供三种基本类型的库的“调试”和“发行”版本:单线程(始终静态链接),多线程静态链接和多线程动态链接(尽管取决于您使用的编译器版本)使用,其中一

  • 问题内容: 可以运行以了解模块任务的依赖性。有没有办法找到 buildscript依赖 的 传递依赖 ? 示例: 直接取决于: 可以在MVNRepository上看到。但是,这些工件有其自己的依赖性。有没有找到方法而无需手动遍历整个依赖树的方法? 为了澄清起见,我正在谈论的类路径由以下方式定义: 问题答案: 您可以使用以下命令: Udacity提供了很棒的Android Gradle 教程,但是您

  • 我有一个java maven项目,我希望使用多线程进行测试。我在src/test中有testng.xml,maven surefire插件被配置为使用它。就像这个页面一样:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 编辑:增加了一定的pom条目

  • Workerman有一个依赖pthreads扩展的MT多线程版本,但是由于pthreads扩展还不够稳定,所以这个Workerman多线程版本已经不再维护。 目前Workerman及其周边产品都是基于多进程单线程的。

  • 问题内容: 在阅读了这样的问题之后,我有了一些疑问。请帮助理解。 调度涉及确定何时运行流程以及运行时间的多少。 linux内核是否调度线程或进程?由于内核中的进程和线程没有区别,调度程序如何对待它们? 如何确定每个线程的数量?一个。如果为一个进程确定了一个时间量(例如100us),是在该进程的所有线程之间共享该时间吗?或b。每个线程的数量由调度程序决定吗? 注意:问题1和问题2是相关的,可能看起来

  • 我开始使用SBT开发Scala应用程序。我发现我需要两个依赖项作为开始,所以这是scala-swingU实用程序和javax.swing.SwingU实用程序。我一直在搜索网络、maven仓库和github,但仍然找不到javax.swing包去哪里了。到目前为止,我已经在Maven Repos中找到了javax,但由于某种原因,javax.swing没有在那里列出。 我试图将javax依赖项添加