我有一个包含很多文件的文件夹结构,其中一些文件是文本,html,照片,我想迭代主线程中的文件,每次文件都是照片,我想把它画出来或(某事)在另一个工人主题上。
伪代码:
主题1:
Class Main{
List list = new ArrayList();
void main(){
for(file f : files) {
if(file is PHOTO_TYPE)
new Thread(new ImageRunnable(file)).start();
}
}
//This causes exception because list.size is still empty
for(int i=0; i<10,i++)
list.remove(i);
}
线程2类:
class ImageRunnable extends Main implements Runnable() {
File file;
ImageRunnable(File f){
this.file = f;
}
void run(){
drawPhoto(file);
}
void drawPhoto(File f){
for(int i=0; i<100,i++)
list.add(i);
//something that can take long time
}
}
答案 0 :(得分:4)
每次文件是for循环中的照片时,这似乎都会启动一个新线程?有没有办法可以启动一次该线程,并在文件名为照片时将其传递给它?
我使用ExecutorService
而不是直接启动线程。然后,您可以拥有一个处理线程池的线程,并根据需要向线程池提交任意数量的文件。请参阅java tutorial。
// this starts a thread-pool with 1 thread
ExecutorService threadPool = Executors.newFixedThreadPool(1);
for (File f : files) {
// you can submit many files but only 1 thread will process them
threadPool.submit(new ImageRunnable(file));
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
假设我在线程1中有一个arrayList对象,我想在线程2中填充它,并在线程1中删除对象,我知道它需要同步,我试过这个例子但是arraylist似乎在线程2中填写后,在线程1中为空,我缺少什么?
完全不同的问题,如果没有具体的代码,很难回答。您需要确保围绕更新和同步读取列表。您可能需要考虑切换到使用BlockingQueue
来处理锁定。然后,您可以将一个线程add(...)
添加到队列中,另一个线程调用take()
。