一段时间后停止一个线程

时间:2011-09-29 09:49:52

标签: java java-me

如何在线程运行5秒后停止运行?

我无法使用java 5+线程功能(必须在j2me中工作)。


可能的解决方案 -

安排两个主题。一个执行实际工作(T1),另一个执行T1(T2)的监视。

一旦T1开始,然后开始T2。 T2每秒在T1上调用isalive()方法,如果在10秒后T2没有死亡,则T2在T1上调用中止,这会终止T1线程。

这可行吗?

Timer timer = new Timer();

TimerTask timerTask  = new TimerTask() {

public void run() {
        getPostData();
    }
};

timer.schedule(timerTask, 0);

public void abortNow() {
    try {
        _httpConnection.close();
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

您的问题没有唯一的答案。这取决于线程的作用。首先,你打算如何阻止该线程?

  1. 如果它详细说明了一些东西,并且这些东西是由“令牌”组成的,例如单个“任务”要做,并且线程从BlockingQueue获取它们,那么你可以用一个所谓的“毒丸”,就像一个模拟任务,线程上写着:“嘿,我必须关闭”。
  2. 如果线程执行的某些操作无法“划分”为“步骤”,那么您实际上应该告诉我们您认为它可以如何关闭。如果它在套接字上的read()上阻塞,则只能关闭套接字以解锁它。
  3. 请注意interrupt()并不意味着在正常情况下停止Thread,如果你interrupt()一个帖子,在大多数情况下它只会继续做它的东西。在99.9%的情况下,使用interrupt()停止线程只是糟糕的设计。

    无论如何,要在5秒后停止它,只需设置一个Timer即可。或者更好join,超时为5秒,然后停止它。问题是如何阻止它。所以请告诉我你怎么认为应该停止这个主题,以便我能更好地帮助你。

    告诉我线程的作用。

    编辑:回复你的评论,只是一个例子

    class MyHTTPTransaction extends Thread {
        public MyHTTPTransaction(.....) {
            /* ... */
        }
        public void run() {
            /* do the stuff with the connection */
        }
        public void abortNow() {
            /* roughly close the connection ignoring exceptions */
        }
    }
    

    然后

    MyHTTPTransaction thread = new MyHTTPTransaction(.....);
    thread.start();
    thread.join(5000);
    /* check if the thread has completed or is still hanging. If it's hanging: */
        thread.abortNow();
    /* else tell the user everything went fine */
    

    :)

    您还可以在Timer设置Condition,或使用Lock,因为我打赌可能存在竞争条件。

    干杯。