【发布时间】:2015-12-15 03:19:58
【问题描述】:
我有一个加载缓慢的程序,我猜这是由于我必须在开始时加载的图像资源量。我认为多线程会有所帮助,但现在我不太确定。这是我的自动多线程方法。
private static Thread[] t;
private static int currentThreads;
public static void loadWithThreads(Object[] array, IntegerRunnable r) {
final int threads = Runtime.getRuntime().availableProcessors();
t = new Thread[threads];
for (int i = 0; i < threads; i ++) {
t[i] = new Thread("HMediaConverter") {
final int id = currentThreads;
int items = (array.length / threads) * currentThreads;
@Override
public void run() {
super.run();
for (int i = items; i < (items + (array.length / threads)); i ++) {
r.run(i);
}
//Recycle this thread so it can be used for another time.
try {
t[id].join();
lock.notifyAll();
currentThreads --;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t[i].setPriority(Thread.MAX_PRIORITY);
t[i].start();
currentThreads ++;
}
}
这是我的图片加载代码:
public static ImageIcon loadImageIcon(String path) {
return new ImageIcon(ImageIO.read(Tools.class.getClassLoader().getResource(path));
}
肯定有办法加快速度吗?我在非常好的 Intel i5 上运行它,它不应该这么慢,所以它一定是我的代码。
【问题讨论】:
-
改用
ExecutorService,可能无法解决问题,但它会比你现在做的更干净 -
另外,一旦
Thread的run方法存在,就无法重新启动 -
@MadProgrammer 请问您说
run()方法无法重新启动时指的是什么?我不太明白你在说什么。感谢您的快速反馈;我很感激。 -
t[id].join();将死锁,因为当前线程在join返回之前无法退出,但join在run方法退出之前不会返回 -
“请问你说run()方法不能重启是指什么?” - 线程是不可重入的,也就是说,一旦
run方法存在,你就不能重复使用Thread的实例,所以//Recycle this thread so it can be used for another time.不起作用,Thread将无法重新启动。如果不了解您要加载的内容、资源数量和大小,也无法评论是否会起作用(或一个好主意)
标签: java multithreading javax.imageio