有一个文件转换的程序,转换大的word文档比较慢,1分钟之后,不管有没有转换完成,开启一个新线程,开始转换下一个文件,应该怎么写。
public class Test {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
class MyThread extends Thread{
private static int num = 0;
public MyThread(){
num++;
}
@Override
public void run() {
System.out.println("主动创建的第"+num+"个线程");
}
}
定时器TimeTask试试
for(iterator : iterator.hasNext();){
new 一个线程来执行你这里面的代码。
}
for循环中的代码放入线程中执行,每一次循环,创建一个新的线程。
首先把转换文件的代码封装成一个类或者方法;
然后用定时器或者线程休眠执行;
参考实现:
public void transform(File file){
//转换文件
}
public void execute(File[] files){
for(File file: files){
new Thread(){
public void run(){
transform(file);
}
}.start();
Thread.sleep(1000*60);
}
}
具体参数和返回结果,自己调整
代码未编译,参考一下结构
我可以理解为你想用并发的解决方案吗?每段代码执行的时间一般不在程序里控制cpu会自动切换上线文。
开多线程之后每个线程执行的时间都是不固定的没必要设定多久
可以考虑使用线程池, 或者始终开启固定数量的多个线程. 不同任务在多个线程并发, 一个任务不需要考虑其他任务的执行时间.
创建一个线程任务。这个任务的作用是提交一个具体操作任务(即你的转换动作)到线程池(或者你启一个线程去处理)。然后再用线程池的定时任务机制去触发创建任务。这样就能达到每1分钟创建一个转换任务且不受转换进度影响的目的了。
final ScheduledExecutorService service = Executors.newScheduledThreadPool(10); // 线程池
// 转换任务
final Runnable convertRun = new Runnable() {
@Override
public void run() {
// 具体的转换代码
}
};
// 提交任务
Runnable createRun = new Runnable() {
@Override
public void run() {
service.submit(convertRun);
// 或者 new Thread(convertRun).start();// 不推荐这种
}
};
// 这个方法更适合你的需求。但是如果用scheduleWithFixedDelay也是可以的。因为提交一个线程并不会花费多少时间
service.scheduleAtFixedRate(createRun, 0, 1, TimeUnit.MINUTES);// 周期提交