如何使用多个扫描器(多个资源)处理多个线程?

问题描述 投票:0回答:1

我正在尝试使用四个扫描仪从四个不同的来源获取数据。我确实意识到我需要使用线程。但是这是错误消息:

P.S =文件的路径在使用线程之前是正确的。 (我使用的是一个文件,路径还可以。)

空空值空值空值java.lang.ArrayIndexOutOfBoundsException:41705在getText.getCities(getText.java:132)在getText $ 1.run(getText.java:23)在java.lang.Thread.run(未知来源)java.lang.ArrayIndexOutOfBoundsException:41705在getText.getNames(getText.java:112)在getText $ 2.run(getText.java:30)在java.lang.Thread.run(未知来源)

代码本身

公共类getText {

static int ln = 41705;
static String [] icaos = new String[ln];
static String [] iatas = new String[ln];
static String [] names = new String[ln];
static String [] cities = new String[ln];

public final Runnable typeA;
public final Runnable typeB;
public final Runnable typeC;
public final Runnable typeD;

public getText() {
    typeA = new Runnable() {
        public void run() {
            getText.this.getCities();
        }
    };


    typeB = new Runnable() {
        public void run() {
            getText.this.getNames();
        }
    };

    typeC = new Runnable() {
        public void run() {
            getText.this.getIcao();
        }
    };

    typeD = new Runnable() {
        public void run() {
            getText.this.getIata();
        }
    };
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    getText x = new getText();
    new Thread(x.typeA).start();
    new Thread(x.typeB).start();
    new Thread(x.typeC).start();
    new Thread(x.typeD).start();

    System.out.println(icaos[32541]);
    System.out.println(iatas[32541]); 
    System.out.println(names[32541]); 
    System.out.println(cities[32541]); 

}

public void getIcao () {
    try {

        int i=0;
        InputStream icao_stream = new FileInputStream("src/icao.txt");
        Scanner icao_s = new Scanner(icao_stream);
        icao_s.useDelimiter(",");
        while(icao_s.hasNext()) {
            icaos[i] = icao_s.next();
            i++;
        }

        icao_s.close();
        icao_stream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void getIata() {
    try {
        int i=0;
        InputStream iata_stream = new FileInputStream("src/iata.txt");
        Scanner iata_s = new Scanner(iata_stream);
        iata_s.useDelimiter(",");

        while(iata_s.hasNext()) {
            iatas[i] = iata_s.next();
            i++;
        }

        iata_s.close();
        iata_stream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void getNames() {

    try {
        int i=0;
        InputStream names_stream = new FileInputStream("src/names.txt");
        Scanner names_s = new Scanner(names_stream);
        names_s.useDelimiter(",");
        while(names_s.hasNext()) {
            names[i] = names_s.next();
            i++;
        }

        names_s.close();
        names_stream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void getCities() {
    try {
        int i=0;
        InputStream cities_stream = new FileInputStream("src/cities.txt");
        Scanner cities_s = new Scanner(cities_stream);
        cities_s.useDelimiter(",");
        while(cities_s.hasNext()) {
            cities[i] = cities_s.next();
            i++;
        }

        cities_s.close();
        cities_stream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

java multithreading java.util.scanner
1个回答
0
投票

所以现在的问题是您已经启动了线程,但是控件立即返回到主线程,而其他线程到那时还没有完成工作。您需要等待这些线程完成工作,然后检查结果。有多种方法可以实现这一目标。一个简单的方法是将main更改为:

public static void main(String[] args) {
    getText x = new getText();
    List<Thread> threads = new ArrayList<>();
    threads.add(new Thread(x.typeA));
    threads.add(new Thread(x.typeB));
    threads.add(new Thread(x.typeC));
    threads.add(new Thread(x.typeD));
    threads.forEach(t -> t.start());
    threads.forEach(t -> {

        try {
            //this makes the main thread to wait for thread "t" to finish
            t.join();
        } catch (InterruptedException e) {
            // log or throw or anything you need to do
        }
    });

    System.out.println(icaos[32541]);
    System.out.println(iatas[32541]);
    System.out.println(names[32541]);
    System.out.println(cities[32541]);
}

这不是最佳答案,而是最简单的答案。其他选项包括使用CyclicBarrierExecutorService

© www.soinside.com 2019 - 2024. All rights reserved.