public void loadData(String filePath, Long offset, Long count) throws RemoteException{
        log("loadData(" + filePath + ", " + offset + ", " + count);
        if(working>0 || workQueue.size()>0){
            throw new RemoteException("Work queued for loaded data, cannot load new data");
        }
        Runnable task = () -> {
            try{
                lock.lock();
                data = null;
                data = MatrixDataSource.fromFile(filePath, offset, count);
                boolean success = false;
                int i = 0;
                while (success == false && i < controllers.size()) {
                    try {
                        controllers.get(i).dataLoaded(workerId, filePath, offset, count);
                        success = true;
                    } catch (Exception e) {
                        i++;
                    }
                }
                if(success == false){
                    throw new Exception("No controller to inform");
                }
            } catch (Exception e) {
                lock.unlock();
                log(e.getMessage());
                return;
            }finally{
                lock.unlock();
            }
            log("Data Loaded");
        };

        new Thread(task,"Data Loading Thread").start();
    }