我面临一个多线程问题。
我有 10 个线程。当我们对应用程序进行分层时,第一个线程将尝试创建文件夹。意思是在剩余线程尝试将文件移动到该文件夹时,在创建文件夹之前。所以我得到 NulpointerException。如何停止剩余的主题直到文件夹创建者线程完成。
像这样的代码:
Static int i;
moveFile()
{
if(i==1){
create();
}
move(){
}
}
我面临一个多线程问题。
我有 10 个线程。当我们对应用程序进行分层时,第一个线程将尝试创建文件夹。意思是在剩余线程尝试将文件移动到该文件夹时,在创建文件夹之前。所以我得到 NulpointerException。如何停止剩余的主题直到文件夹创建者线程完成。
像这样的代码:
Static int i;
moveFile()
{
if(i==1){
create();
}
move(){
}
}
您可以通过多种方式做到这一点。
创建一个大小为 1 的锁存器(倒计时锁存器)。
在创建文件夹后,在创建文件夹的线程中调用countdown()
闩锁上的方法。在所有其他线程中await()
,在开始任何处理(如移动文件)之前调用闩锁上的方法。
还有无数其他方法可以做到这一点。如果可能,请选择最简单的方法(仅在创建文件夹后生成移动文件等的线程/任务)
我认为 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!
}
}
}