用Java生成一个线程

时间:2014-02-28 18:16:58

标签: java multithreading

我有一个包含很多文件的文件夹结构,其中一些文件是文本,html,照片,我想迭代主线程中的文件,每次文件都是照片,我想把它画出来或(某事)在另一个工人主题上。

  • 每次文件是for循环中的照片时,这似乎都会启动一个新线程?有没有办法可以启动一次该线程,并在文件名为照片时将其传递给它?
  • 另一个问题,让我说我在线程1中有一个arrayList对象,我想在线程2中填充它,并在线程1中从它中删除对象,我知道它需要同步,我试过这个例子但是在线程2填充后,arraylist在线程1中似乎是空的,我缺少什么?

伪代码:

主题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
    }
}

1 个答案:

答案 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()