如何使线程等待状态直到第一个线程完成

时间:2013-06-20 10:05:20

标签: java multithreading

我正面临一个多线程问题。

我有10个Threads.when我们strat应用程序第一个线程将尝试创建该文件夹。 意味着当剩下的线程尝试将文件移动到该文件夹​​,然后创建folder.so我得到NulpointerException。如何停止剩余的theads到文件夹creater线程完成。

像这样的代码:

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

3 个答案:

答案 0 :(得分:2)

你可以通过多种方式实现这一目标。

  1. 检查线程中是否存在文件夹,然后将文件放入其中
  2. 仅在创建文件夹后运行第二个线程,以便永远不会发生这种情况。如果有多个文件夹和那么多文件,那么在创建文件夹之后启动新线程,其中第二个线程专门将文件推送到该特定文件夹

答案 1 :(得分:2)

创建一个大小为1的锁存器(countdown latch)。

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

有许多其他方法可以做到这一点。如果可以选择最简单的方法(只在创建文件夹后生成移动文件的线程/任务)

答案 2 :(得分: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!
    }
}

}