java如何在多线程执行完后才执行其他任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何在多线程执行完后才执行其他任务相关的知识,希望对你有一定的参考价值。

for(int i=0;i<fileList.size();i++)
final String srcFile=srcDir+"/"+fileList.get(i).getName();
final String dstFile=dstDir+"/"+fileList.get(i).getName();
Thread thread = new Thread(new Runnable()
public void run()
copyTimer(srcFile,dstFile);

);


//开始执行解压操作
List<File> descFileList = scanFiles(dstDir);
System.out.println("++++++" + descFileList);
unZipFile(descFileList, dstDir, unZip);
如上代码显示,让他在for循环之后才执行下面的unZipFile方法

java.util.concurrent.CountDownLatch 这个类可以实现你所要的功能

例如:CountDownLatch latch = new CountDownLatch(5) //声明计数器为5个
Thread t = new Thread()
public void run()
try
//TODO 你的应用
catch (Exception e)
//TODO 异常处理

finally
latch.countDown(); //这句是关键
System.out.println("ok"); //5个线程都跑完后输出


;
t.start();
然后让以上操作循环五次(就是说同时开5个线程),那么这个"ok"就会在等到这5个线程都ok后才会被输出一次。
参考技术A 给点提示
可以设置一个map对象
key为fileName,value 为boolean 结束了就设置为true,没结束就设置为false

然后while循环
直到map中所有的value都为true时才break;
执行你所说的语句本回答被提问者和网友采纳
参考技术B 通过标识符判断循环是否结束,然后再执行操作 参考技术C 设置一个计数器,每个线程执行完后计数器加一然后查看计数器是否已满(任务都完成),没有的话就阻塞,是的话就唤醒其他所有线程,大家一起来执行下一次任务。要注意公用的计数器的线程安全!

java如何检查执行的线程已卡死

swt执行线程
SWT中的多线程机制和awt/swing中有些不同,这个大家应该都知道,不过还是要说下,Display对象中负责调用其他线程的方法有以下3种:● asyncExec(Runnable runnable):异步启动新的线程。所谓异步就是,UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。● syncExec(Runnable runnable):同步启动新的线程。所谓同步就是,UI线程会等待runnable对象执行结束后才会继续进行,当runnable对象是耗时大的线程时,尽量不要采用此种方式。另外,对于该种方式创建的线程可通过getSyncThread()方法获得线程对象。● timerExec(int milliseconds,Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。当然用此方法创建的线程启动后,与UI线程是异步的。如果指定的时间为负数,将不会按时启动线程。另外Display对象中,与UI线程相关的方法如下所示:● 获得当前的UI线程对象的方法:getThread(),返回Thread对象。● 使UI线程处于休眠状态:sleep()。● 唤醒UI线程:wake()。上面几点都是书里面的原话,不做阐述了.下面我要说的是一个写法的问题,不能小瞧啊,后果很严重.如果有一个线程他要做的事需要很久比如5分钟,像我这样的初学swt的人一定是new了一个线程然后getDisplay().asyncExec(线程对象); 结果虽然执行成功,但是界面确处于挂起状态(假死),直到执行结束,不过要说的是的确是异步执行的,还是ui却不知道为什么停止用户响应,原理暂时先不去理了,swt源码太复杂了.这里面就要引出一个问题为什么不 像下面这么写呢?Thread thread = new Thread(线程对象);
thread.start();
因为swt中非UI线程中调用窗口控件如果不像上面三种写法那样写的话,会抛org.eclipse.swt.SWTException: Invalid thread access这个异常在swt中程序启动时只有一个主线程,在这里与awt和swing是不一样的,它不允许其他线程访问UI主线程中的部件,具读过swt源码的人说AsyncExec方法根本就没有新启动一个线程而是由Synchronizer调用其中的 run 方法而已.如果是这样的话,也就难怪UI会挂起.解决这个问题的一个比较好的方法是如果要异步执行的线程所做的工作非常少的话,就无所谓了,如果异步线程需要执行很长时间的话,应该像下面这样启动线程Thread thread = new Thread(线程对象);
thread.start();在线程对象里面所有调用到UI部件的地方classFinder.getGui().getDisplay().syncExec(new Runnable()
public void run()
//do run

);历经几个小时问题终于解决了这里做个总结吧.我对swt多线程的评价swt的syncExec ,asyncExec 以及timerExec都是伪线程执行方法,把它看成特别的Synchronizer调用就可以了,syncExec ,asyncExec 以及timerExec执行的线程要做的事只是改变UI部件的属性而已执行时间不能太长.此外的其他操作仍然由传统的线程来做.这里要特别注意,swt执行线程只用于在传统线程中操作ui组建在这里要感谢内部类,否则一个复杂的swt线程不知道要写多少个为swt部件服务的标准类
参考技术A 查询线程的状态,根据状态码判断。。

以上是关于java如何在多线程执行完后才执行其他任务的主要内容,如果未能解决你的问题,请参考以下文章

java线程执行完后自己结束吗

[多线程] 等待所有任务执行完成

java如何检查执行的线程已卡死

java多线程对CountDownLatch的使用实例

CountDownLatch同步工具类的使用

关于多线程提高程序执行速率的问题