等待问题 - 通知实施

时间:2011-11-08 09:00:16

标签: java multithreading

我正在开发Java多线程,我在为它们分配4个不同的文件后开始4个线程,然后上传到服务器。

我的目标是,当一个线程完成文件上传时,我需要启动另一个线程为其分配一个新文件。

每次上传文件后,我都会收到服务器的通知。

//添加第一组文件的代码

 for (int count = 0; count < 4; count++) {
                if (it.hasNext()) {
                    File current = new File((String) it.next());

                    try {
                        Thread t = new Thread(this, current );
                        t.start();
                        t.sleep(100);
                    } catch (Exception e) {
                    }
                }
            }

现在,我正在为另一个线程分配一个文件&amp;保持线程处于等待状态。 当前一个线程通知时,当前线程应该开始上传。

if (tempThreadCounter == 4 ) {

                if (it.hasNext()) {
                    File current = new File((String) it.next());
                        try {
                        Thread t = new Thread(this, current);
                        t.start();

                        synchronized (this) {
                            t.wait();
                        }
                        tempThreadCounter++;
                    } catch (Exception e) {
                    }
                }
            }

关于run方法的最后声明,我正在添加以下语句。

public void run (){

// Performing different operations

//Final statement of the run method below
synchronized (this) {
   this.notifyAll();
}
}

目前,所有5个线程都在同时开始上传。 应该是前4个线程应该开始上传&amp;第五个线程只有在任何线程通知它已完成其操作时才会启动。

有关错误的线程实现的任何建议。

3 个答案:

答案 0 :(得分:2)

您可以将ExecutorServicenewFixedThreadPool一起使用,并指定并发为1.但实际上,为什么需要多个线程?一个线程完成所有上传,因此用户界面保持响应应该就足够了。

ExecutorService exec = Executors.newFixedThreadPool(1); //1 thread at a time
for (int count = 0; count < 4; count++) {
    if (it.hasNext()) {
        File current = new File((String) it.next());
        exec.execute(new Runnable() {
             @Override
             public void run() {
                 upload(current);
             }
        });
     }
}
exec.shutdown();
exec.awaitTermination(900, TimeUnit.SECONDS);

答案 1 :(得分:1)

扔掉它并使用java.util.concurrent.Executor。

答案 2 :(得分:0)

你可以加入线程而不是等待它

try {
    t.join();
}catch(InterruptedException e){
    throw new RuntimeException(e);
}
tempThreadCounter++;