0

我面临一个多线程问题。

我有 10 个线程。当我们对应用程序进行分层时,第一个线程将尝试创建文件夹。意思是在剩余线程尝试将文件移动到该文件夹​​时,在创建文件夹之前。所以我得到 NulpointerException。如何停止剩余的主题直到文件夹创建者线程完成。

像这样的代码:

    Static int i;
moveFile()
{
if(i==1){
create();
}
move(){
}
}
4

3 回答 3

2

您可以通过多种方式做到这一点。

  1. 检查您的线程中是否存在文件夹,然后将文件放入其中
  2. 仅在创建文件夹后运行第二个线程,这样就不会发生这种情况。如果有多个文件夹并且文件太多,则在创建文件夹后启动新线程,其中第二个线程专门将文件推送到该特定文件夹中
于 2013-06-20T10:07:46.510 回答
2

创建一个大小为 1 的锁存器(倒计时锁存器)。

在创建文件夹后,在创建文件夹的线程中调用countdown()闩锁上的方法。在所有其他线程中await(),在开始任何处理(如移动文件)之前调用闩锁上的方法。

还有无数其他方法可以做到这一点。如果可能,请选择最简单的方法(仅在创建文件夹后生成移动文件等的线程/任务)

于 2013-06-20T10:11:39.417 回答
0

我认为 Thread.join() 是您正在寻找的。它在线程上执行 wait() (可能有超时),直到执行结束。

将“文件夹线程”的引用传递给其他每个“文件线程”,然后加入()它。

例子:

public class JoinThreads {
static ArrayList<FileThread> fthreads = new ArrayList<FileThread>();
public static void main(String[] args) {
    Thread folderThread = new Thread () {
        @Override
        public void run() {
            // Create the folder
        }
    }.start();
    // Add new threads to fthreads, pass folderThread to their constructor 
    for (FileThread t : fthreads) {
        t.start();
    }
}

public class FileThread extends Thread {
    Thread folderThread;
    File file;

    public FileThread(Thread folderThread, File file) {
        this.folderThread = folderThread;
    }
    @Override
    public void run() {
        try {
            folderThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Save the file, folder should already exist!
    }
}

}

于 2013-06-20T10:43:32.147 回答