gpt4 book ai didi

java - 示例多线程程序

转载 作者:行者123 更新时间:2023-12-01 15:29:24 25 4
gpt4 key购买 nike

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

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. 您正在测量耗时。即使在最好的情况下,这也可能是不可靠的(因为您的计算机上正在运行许多其他线程),但如果您有多个并行运行的 Java 线程,它可能会使您的测量更加不准确。因此,对于此类任务,也许单线程方法效果更好,但不要相信我的话:用您经历过的固定列表替换随机生成的 IP,并尝试使用不同数量的线程运行相同的测量.

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

  3. 接上一点:System.out.println() 不是线程安全的,因此您最终可能会看到一条消息切入另一条消息的中间。这不是世界末日,但您可能不想要困惑的输出。

关于java - 示例多线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com