是否使用Threads正确连接

时间:2011-07-03 14:07:02

标签: java

我想执行某项任务只能获得1000 MS,如果超过,我不想继续执行任务, 我已经使用了join。

如果这是正确的,请告诉我并指导我

import java.util.List;

public class MainThread {

    public static void main(String args[]) throws InterruptedException {
        Thread mainthread = Thread.currentThread();
        ChildThread child = new ChildThread();
        Thread childThread = new Thread(child);
        childThread.start();

        mainthread.join(1000);
        List list = child.getData();

        if(list.size()<0)

        {
            System.out.println("No Data Found");
        }
    }
}

ChildTHread

import java.util.ArrayList;
import java.util.List;

public class ChildThread implements Runnable

{

    List list = new ArrayList();

    public List getData() {
        return list;
    }

    public void run() {
        // This List Data is feteched from Database currently i used some static data
        list.add("one");
        list.add("one2");
        list.add("one3");

    }
}

4 个答案:

答案 0 :(得分:3)

不。不正确。你根本不需要MainThread,你应该调用childThread.join(1000)。

但是这种方法也存在问题 - 这意味着子线程无论如何都会继续运行。 因此,您应该在join:

之后调用childThread.interrupt()
childThread.join(1000);
childThread.interrupt();

并在你的孩子线程中定期在你的childThread中执行类似的操作:

if (interrupted()) {
   return;
}

并在需要的地方处理InterruptedException - 通常围绕任何wait()方法。

答案 1 :(得分:1)

中断线程是更常见(也更好)的方法。如果您希望任务执行最多1秒然后停止,请使用Thread.interrupt(),否则线程将继续运行。请务必注意,根据实际代码的结构,您可能需要传播中断。

示例

public class Demo {
    public static void main(String[] args){
        final List<String> list = new ArrayList<String>(3);

        final Thread t = new Thread(new Runnable(){
            @Override
            public void run() {
                synchronized(list){
                    list.add("one");
                    list.add("one2");
                    list.add("one3");
                }
            }
        }, "DemoThread");
        t.start();

        try {
            t.join(1000);
            t.interrupt();
        } catch (InterruptedException e) {
            // handle exception
        }

        synchronized(list){
            if(list.isEmpty()){
                System.out.println("No data found");
            }else{
                System.out.println(list);
            }
        }
    }
}

答案 2 :(得分:0)

不,这不起作用,因为这段代码会等待一秒钟,如果线程没有完成,它就会继续。该线程将继续运行。调用thread.interrupt()来中断线程,或者关闭连接以便它抛出异常并停止线程,然后加入线程。

答案 3 :(得分:0)

是的,就是这样,我看到的唯一问题是在ChildThread列表中,我建议你使用这样的同步方法,这样你就不会有竞争条件

List list = Collections.synchronizedList(new ArrayList());

如果你想要运行的线程停止,如果它的执行时间超过1000毫秒我建议你使用Thread对象的中断方法,不要忘记在子线程中捕获中断异常,这样你就不会有不必要的异常在日志中