Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可调用任务未正确执行_Java_Multithreading_Thread Safety_Executorservice - Fatal编程技术网

Java 可调用任务未正确执行

Java 可调用任务未正确执行,java,multithreading,thread-safety,executorservice,Java,Multithreading,Thread Safety,Executorservice,嗨,我已经创建了一个简单的任务,它正在攻击一个第三方API 我试图创建一个可调用的任务,并与ExecutorService并行执行它 我得到的输出是 Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL] Callable Tasks5 Starting Job for ScriptRELIANCE After wait 但是没有得到工作完成的结果 我尝试减少作业大小,使用FixedThreadPool和CachedThreadPool更改ExecutorS

嗨,我已经创建了一个简单的任务,它正在攻击一个第三方API

我试图创建一个可调用的任务,并与ExecutorService并行执行它

我得到的输出是

Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL]
Callable Tasks5
Starting Job for ScriptRELIANCE
After wait
但是没有得到工作完成的结果

我尝试减少作业大小,使用FixedThreadPool和CachedThreadPool更改ExecutorService的创建

将DataFetchTask更改为newCallable as方法以及早期版本,该类本身直接实现了Callable

当我尝试获取future.get时,它会给出NullPointerException

我尝试了多种方法,但不确定可调用任务创建有什么问题


我通过控制器点击服务

您的yahooFinDataFetcher可能为空,因为IOC无法注入它的实例。DataFetchTask未作为组件处理

尝试在DataFetchTask中手动实例化yahooFinDataFetcher,看看是否确实如此

@所需参数构造函数 公共类数据获取任务{ 私有最终字符串脚本; 专用最终时间间隔; 专用最终范围时间范围; @自动连线 YahooFinDataFetcher YahooFinDataFetcher=新的YahooFinDataFetcher; ...
你读过它的实际功能吗?我几乎肯定你不应该在这里使用它。@VGR读得很好,但为什么ExecutorService在这里不是一个好主意?ExecutorService很好。用SynchronousQueue支持它不是。@VGR明白了,谢谢,明白了你的意思。类设计有什么问题吗?有没有办法在她身上注入依赖关系在手动实例化DataFetchTask之后,您可以将YahooFinDataFetcher自动连线向上移动一个级别,我假设它对IOC容器可见,并将其作为构造函数参数传递回DataFetchTask。
@RequiredArgsConstructor
public class DataFetchTask {

    private final String script;
    private final TimeInterval timeInterval;
    private final Range timeRange;

    @Autowired
    YahooFinDataFetcher yahooFinDataFetcher;

    public Callable<YahooFinResponse> newCallable() {

        return new Callable<YahooFinResponse>() {

            public YahooFinResponse call() {
                System.out.println("Starting Job for Script"+script);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("After wait");
                final YahooFinResponse yahooFinResponse = yahooFinDataFetcher.fetchData(script +
                        ".NS", timeInterval, timeRange);
                System.out.println("Returning from call"+yahooFinResponse.chart.error);
                return yahooFinResponse;
            }
        };
    }

}
@Component
public class YahooFinDataFetcher {

    private static final OkHttpClient client = new OkHttpClient();
    private static final Gson gson = new Gson();

    private static final String BASE_URL = "***;
    private static final String DOMAIN = "**";
    private static final String CORS_DOMAIN = "***";

    public YahooFinResponse fetchData (final String scriptName, final TimeInterval timeInterval,
            final Range range) {
        System.out.println("Calling Service");
        final Request request = new Request.Builder()
                .url(createUrl(scriptName, timeInterval, range))
                .build();

        final Call call = client.newCall(request);
        try {
            final Response response = call.execute();
            final String responseStr = response.body().string();
            final YahooFinResponse yahooFinResponse = gson.fromJson(responseStr,
                    YahooFinResponse.class);
            System.out.println(String.format("Returning Data For YahooFInResponse %s "
                    + "\n",yahooFinResponse));
            return yahooFinResponse;
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(String.format("Returning null from fetchData for %s  TimeInterval %s, "
                + "Range %s \n",scriptName,timeInterval,range));
        return null;
    }
Size5list[RELIANCE, SBIN, YESBANK, ITC, VEDL]
Callable Tasks5
Starting Job for ScriptRELIANCE
After wait