我正在开发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;第五个线程只有在任何线程通知它已完成其操作时才会启动。
有关错误的线程实现的任何建议。
答案 0 :(得分:2)
您可以将ExecutorService与newFixedThreadPool一起使用,并指定并发为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++;