Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道动态大小的线程数组中的所有元素是否在Java中完成?_Java_Multithreading_Runnable - Fatal编程技术网

如何知道动态大小的线程数组中的所有元素是否在Java中完成?

如何知道动态大小的线程数组中的所有元素是否在Java中完成?,java,multithreading,runnable,Java,Multithreading,Runnable,如果我有一个动态大小的线程数组,我将如何确定该数组中的所有线程是否已经完成?我还计划创建一个函数,当数组中的所有线程都完成时,该函数将触发另一个线程启动。 多谢各位 public static boolean areAllThreadsTerminated(Collection<Thread> threadList) { for (Thread thread : threadList) if (thread.getState() != Thread.State

如果我有一个动态大小的线程数组,我将如何确定该数组中的所有线程是否已经完成?我还计划创建一个函数,当数组中的所有线程都完成时,该函数将触发另一个线程启动。 多谢各位

public static boolean areAllThreadsTerminated(Collection<Thread> threadList) {
    for (Thread thread : threadList)
        if (thread.getState() != Thread.State.TERMINATED)
            return false;
    return true;
}
在每个线程的末尾

threadList.notify();

线程可以处于以下状态之一:

  • 新建-尚未启动的线程处于此状态
  • RUNNABLE-在Java虚拟机中执行的线程处于此状态
  • 被阻止-被阻止等待监视器锁定的线程处于此状态
  • 等待-无限期等待另一个线程执行特定操作的线程处于此状态
  • TIMED_WAITING-在指定等待时间内等待另一个线程执行操作的线程处于此状态
  • 终止 已退出的线程处于此状态。 线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态
使用下面类似的方法验证
Thread.getState()
是否已
终止

if(thread.getState() == Thread.State.TERMINATED){ 
 // thread completed its job
}
run()
方法结束时,
Thread
将进入
TERMINATED
状态

在您的特定用例中,您可以循环通过一个数组来验证所有线程是否已终止,然后根据您的需求创建另一个线程来执行下一个任务

如果我有一个动态大小的线程数组,我将如何确定该数组中的所有线程是否已经完成

我将使用一个
ExecutorService
线程池,然后您可以查询该线程池以查看作业是否已被完全处理。缓存的线程池将为您提交给它的每个
Runnable
s(或
Callable
s)分叉一个线程。您还可以使用固定数量的线程来运行提交的作业的固定线程池。这样就不必保留自己的线程数组等

ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.submit(myRunnable);
...
// after you submit the last job, you shut it down
threadPool.shutdown();
// then we can wait for the pool to finish
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

如果我正确理解了您的问题,您可以使用
Thread
isAlive()
方法来确定线程是否仍处于活动状态。您是否查看了
wait()
notify()
notifyAll()
?您好。感谢您对@fabfas的回复。我是穿线新手。我只想问一下,在使用线程时执行以下操作是一件好事还是一件必要的事情如果我有一个类用run()实现了一个Runnable接口公共类a实现Runnable(){run(){//do something}},那么在主线程中我有thread thread=new thread(new a())thread.start()或者我应该只是实例化一个没有线程的对象。请注意,主线程是Swing/JFrame类。谢谢。@jamesandrewsarmiento这实际上取决于对象封装的行为类型。例如,如果对象A假设执行长时间运行的作业,那么最好创建一个线程,否则Swing/JFrame屏幕将没有响应。如果用户希望得到即时响应,则无需创建线程。@jamesandrewsarmiento因为您正在处理Swing应用程序,我建议您查看一下。注意类doc中的最后一句话:“因为SwingWorker实现了Runnable,所以SwingWorker可以提交给执行器执行。”这类执行器有几种实现(例如,看看ThreadPoolExecutor)。这将允许您将作业的提交与执行作业的线程数分离。感谢@Sash的响应,我能问一下“在每个线程的末尾”是什么意思吗?它是指在实现可运行接口的类中的run方法内部?我应该将areAllThreadsFinished函数放在线程或实现可运行接口的内部类中吗?我忘了告诉它主线程是GUI/Swing JFrame。谢谢。好的,如果你在GUI中运行,你不应该停下来等待,只要把areAllThreadsFinished放在GUI线程中,不用等待。我不知道线程在做什么,但你正在用网络或长计算做一些事情,有很多标准的解决方案,比如谷歌的“GUI长计算示例java线程”。或者你需要一个进度条。还有SwingWorker类用于Swing。有很多例子。
if(thread.getState() == Thread.State.TERMINATED){ 
 // thread completed its job
}
ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.submit(myRunnable);
...
// after you submit the last job, you shut it down
threadPool.shutdown();
// then we can wait for the pool to finish
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);