启动一个在指定时间后终止进程的线程

时间:2013-04-11 10:37:47

标签: java multithreading

我正在为一个网络执行一个程序,我在循环中执行了一定数量的任务,它工作正常,但是当由于网络问题而出现任何缺陷时,它会陷入任何一项任务中。所以我想创建一个线程,它在控制进入循环时开始,经过一段时间后,它会自动终止并继续进程。

例如 -

for ( /*itearting condition */)
{
    //thread start with specified time.
    task1;
    task2;
    task3;
    //if any execution delay occur then wait till specified time and then
    //continue.
}

请给我一些关于此的线索,一个片段可以帮助我很多,因为我需要尽快解决它。

2 个答案:

答案 0 :(得分:1)

线程只能通过其合作终止(假设您要保存该过程)。通过线程的合作,您可以使用它支持的任何终止机制来终止它。没有它的合作,就无法做到。通常的做法是将线程设计为interrupted。如果时间过长,你可以让另一个线程中断它。

答案 1 :(得分:0)

我想你可能需要这样的东西:

import java.util.Date;

public class ThreadTimeTest {

    public static void taskMethod(String taskName) {
        // Sleeps for a Random amount of time, between 0 to 10 seconds
        System.out.println("Starting Task: " + taskName);
        try {
            int random = (int)(Math.random()*10);
            System.out.println("Task Completion Time: " + random + " secs");
            Thread.sleep(random * 1000);
            System.out.println("Task Complete");
        } catch(InterruptedException ex) {
            System.out.println("Thread Interrupted due to Time out");
        }
    }

    public static void main(String[] arr) {
        for(int i = 1; i <= 10; i++) {
            String task = "Task " + i;
            final Thread mainThread = Thread.currentThread();
            Thread interruptThread = new Thread() {
                public void run() {
                    long startTime = new Date().getTime();
                    try {
                        while(!isInterrupted()) {
                            long now = new Date().getTime();
                            if(now - startTime > 5000)  {
                                //Its more than 5 secs
                                mainThread.interrupt();
                                break;
                            } else
                                Thread.sleep(1000);
                        }
                    } catch(InterruptedException ex) {}
                }
            };
            interruptThread.start();
            taskMethod(task);
            interruptThread.interrupt();
        }
    }
}