多线程程序示例

时间:2012-03-16 21:39:21

标签: java multithreading

我是Java多线程世界的新手,我编写了这个程序,我只是想确保它是多线程程序。在这里,我创建了30个由10个线程执行的任务。那么这个实现是对还是不对?我想你可以在我的代码中了解我在做什么。我只是生成一些随机的ip地址并将其传递给方法,并查看从该方法返回后每次调用的平均时间。为此,我在run方法中编写了所有任务。任何建议将不胜感激。

public class Testing {

public static void main(String[] args) throws InterruptedException {
    int size = 10;

    // create thread pool with given size
    ExecutorService service = Executors.newFixedThreadPool(size); 

    // queue some tasks
    for(int i = 0; i < 3 * size; i++) {
        service.submit(new ThreadTask(i));
    }


    // wait for termination        
    service.shutdown();
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    }
}


class ThreadTask implements Runnable {
    private int id;

    public ThreadTask(int id) {
        this.id = id;
    }

    public void run() {
        System.out.println("I am task " + id);

        Map<Long, Long> histgram = new HashMap<Long, Long>();
        Set<String> ipNull = new HashSet<String>();

        GetLocationByIpResponse resp = null;

        long total = 10000;
        long difference = 0;
        long found = 0;
        long found_country = 0;
        long runs = total;
        try {
            long start_total = System.nanoTime();
            while(runs > 0) {

                String ipAddress = generateIPAddress();

                long start_time = System.nanoTime();

                resp = PersonalizationGeoLocationServiceClientHelper.getLocationByIp(ipAddress);

                long end_time = System.nanoTime();

                if(resp.getLocation() != null) {
                 difference = (end_time - start_time)/1000000;
                } else if(resp.getLocation() == null) {
                  difference  = 0;
                } 

                printResult(ipAddress, resp, difference);


                Long count = histgram.get(difference);
                if (count != null) {
                    count++;
                    histgram.put(Long.valueOf(difference), count);
                } else {
                    histgram.put(Long.valueOf(difference), Long.valueOf(1L));
                }

                runs--;

            }
            long end_total = System.nanoTime();

            long finalTotal = (end_total - start_total)/1000000;

            float avg = (float)(finalTotal) / total;

            Set<Long> keys = histgram.keySet();

            for (Long key : keys) {
                Long value = histgram.get(key);
                System.out.println("$$$GEO OPTIMIZE SVC MEASUREMENT$$$, HG data, " + key + ":" + value);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        }


    }

1 个答案:

答案 0 :(得分:1)

多线程似乎没有任何问题,但有三个潜在的问题。

  1. 您正在测量经过的时间。这在最好的时候可能是不可靠的(因为您的计算机上运行了许多其他线程),但如果您有多个并行运行的Java线程,它可能会使您的测量结果更加准确。 因此,对于这种类型的任务,单线程方法可能效果更好,但不要相信我的意思:用您经过的固定列表替换随机生成的IP,并尝试使用不同数量的线程运行相同的测量

  2. 我无法判断您从run()调用的方法本身是否是线程安全的。编写多线程代码时,请仔细检查您调用的所有内容是否也是线程安全的(例如SimpleDateFormat不是)。

  3. 从上一点开始:System.out.println()不是线程安全的,因此最终可能会在另一个中间切换一条消息。这不是世界末日,但你可能不希望杂乱的输出。