Java 等待-通知实现的问题

Java 等待-通知实现的问题,java,multithreading,Java,Multithreading,我正在进行Java多线程处理,在分配了4个不同的文件之后,我将启动4个线程,以上传到服务器 我的目标是,当一个线程完成文件上传时,我需要启动另一个线程为其分配一个新文件 每次上传文件后,我都会收到来自服务器的通知 //用于添加第一组文件的代码 for (int count = 0; count < 4; count++) { if (it.hasNext()) { File current = new File((S

我正在进行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) {
                    }
                }
            }
在run方法的最后一条语句中,我添加了以下语句

public void run (){

// Performing different operations

//Final statement of the run method below
synchronized (this) {
   this.notifyAll();
}
}
目前,所有5个线程正在同时开始上传。 应该是前4个线程应该开始上传&第五个线程应该只在任何线程通知它已完成其操作时启动


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

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

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

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

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

您可以在线程上加入,而不是等待线程

try {
    t.join();
}catch(InterruptedException e){
    throw new RuntimeException(e);
}
tempThreadCounter++;
您可以与一起使用,并将并发性指定为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);
ExecutorService exec=Executors.newFixedThreadPool(1)//一次1个线程
对于(int count=0;count<4;count++){
if(it.hasNext()){
当前文件=新文件((字符串)it.next());
exec.execute(新的Runnable(){
@凌驾
公开募捐{
上传(当前);
}
});
}
}
exec.shutdown();
执行等待终止(900,时间单位秒);
您可以与一起使用,并将并发性指定为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);
ExecutorService exec=Executors.newFixedThreadPool(1)//一次1个线程
对于(int count=0;count<4;count++){
if(it.hasNext()){
当前文件=新文件((字符串)it.next());
exec.execute(新的Runnable(){
@凌驾
公开募捐{
上传(当前);
}
});
}
}
exec.shutdown();
执行等待终止(900,时间单位秒);

我的目标是,当一个线程完成文件上传时,我需要启动另一个线程为其分配一个新文件。->如果它们不是并发执行,为什么有多个线程?我第一次启动4个线程。每当一个线程完成执行时,我需要将一个文件分配给一个新线程,直到所有文件都已上载。我的目标是,当一个线程完成文件上载时,我需要启动另一个线程为其分配一个新文件。->如果它们不是并发执行,为什么有多个线程?我第一次启动4个线程。每当一个线程完成执行时,我需要将一个文件分配给一个新线程,直到所有文件都上传完毕。谢谢回复。如果每次使用4个线程上传文件,直到所有文件都上传完毕,那么如何使上述代码工作?exec.com会为您这样做,它会等到所有文件都上传完毕。我已将超时设置为900秒,这是最大等待时间。如果您想增加上传的并发性,只需更改构造函数中的数字1(确保服务器部件也支持并发性)。谢谢您的回复。如果每次使用4个线程上传文件,直到所有文件都上传完毕,那么如何使上述代码工作?exec.com会为您这样做,它会等到所有文件都上传完毕。我已将超时设置为900秒,这是最大等待时间。如果您想增加上传的并发性,只需更改构造函数中的数字1(确保服务器部件也支持并发性)。