0

Excelファイルにいくつかの場所があり、各ポイントにはlngとlat座標があります。

ここで、Google マップの静的マップ API を使用して、各ポイントの静的マップを作成しようとしています。

そして、パーサーとローダーの 2 つのコンポーネントがあります。

パーサーは Excel ファイルの読み取りに使用され、ロード済みはタイルのロードに使用されます。

そして、ローダーを別のスレッドで実行します。

public class Parser {
    private static Parser instance;
    private StaticMapLoader loader;

    private Parser(StaticMapLoader loader) {
        this.loader = loader;
    }

    public synchronized static Parser getInstance(StaticMapLoader loader) {
        if (instance == null) {
            instance = new Parser(loader);
        }
        return instance;
    }

    public void parse(String path) {
        List<Branch> result = new ArrayList<Branch>();

        InputStream inp;
        try {
            inp = new FileInputStream(path);
            Workbook wb = WorkbookFactory.create(inp);
            Sheet sheet = wb.getSheetAt(0);
            int rows = sheet.getLastRowNum();


            for(Row r : sheet.getRows){
                loader.addTask(r.type,r.name,r.x,r.y);
            }
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
//      Branch bc = new Branch("网点1", null, null);
        return result;
    }

}

ローダ:

public class StaticMapLoader extends Thread {
    private final static Logger log = Logger.getLogger(StaticMapLoader.class);

    private List<Task> tasks = new ArrayList<Task>();
    private String tilePath;

    private boolean running = false;


    public StaticMapLoader(String saveDir) {
        this.tilePath = saveDir;
    }


    @Override
    public void run() {
        while (running) {
            log.debug("run " + tasks.size());
            if (tasks.size() > 0) {
                Task t = tasks.get(0);
                if (t != null && t.status == Status.waiting) {
                    tasks.remove(0);
                    t.status = Status.running;
                    downLoad(t);
                }
            }

        }
    }

    private void downLoad(Task t) {
        log.debug(String.format("load data for " + t.toString()));
        //down tiles and save 
        t.status=Status.success;
    }

    public void addTask(String type, String name, double x, double y) {
        log.debug(String.format("add task of :%s,%s", type, name));
        tasks.add(new Task(type,name,x,y));
    }

    public void startRunning() {
        running = true;
        this.start();
    }

    public void stopRunning() {
        running = false;
        this.interrupt();
    }

    class Task {
        Status status = Status.waiting;

        String type, name;
        double x,y;

        Task(String type, String name, double x,double y) {
            this.type = type;
            this.name = name;
            this.xian = xian;
            this.x = x;
            this.y = y;
        }
    }

    enum Status {
        waiting, running, fail, success
    }
}

プロセスはかなり単純で、StaticMapLoaderのフィールドがありArrayListます。Parserレコード(場所)を解析している間、リストにスローされます。

そして、ローダーはリストを反復し、データをダウンロードします。

ただし、ここで奇妙な問題に遭遇します。

@Override
public void run() {
    while (running) {
        log.debug("run " + tasks.size());
        if (tasks.size() > 0) {
            Task t = tasks.get(0);
            if (t != null && t.status == Status.waiting) {
                tasks.remove(0);
                t.status = Status.running;
                downLoad(t);
            }
        }

    }
}

上記のコードが実行され、次のようなログが取得されます。

run 1
add task of ..
run 2
add task of ...

ただし、ログ行にコメントを付けるdownLoadと、 が呼び出されることはなく、次のようになります。

run 1
run 2
......

これは Thread が原因のようですが、何か見落としがありますか?

ところで、上記のコードはHttpServletコンテキスト内で実行され、次のように開始します。

@Override
public void init() throws ServletException {
    super.init();

    try {
        URL fileUrl = getServletContext().getResource(getInitParameter("xlsxFile"));
        URL tilePath = getServletContext().getResource(getInitParameter("tilePath"));

        StaticMapLoader loader = new StaticMapLoader(tilePath.getPath());
        loader.startRunning();


        Parser.getInstance(loader).parse(fileUrl.getPath());

    } catch (MalformedURLException e) {
    }
}
4

0 に答える 0