我想执行某项任务只能获得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");
}
}
答案 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对象的中断方法,不要忘记在子线程中捕获中断异常,这样你就不会有不必要的异常在日志中