2011-07-03 1 views
1

私は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"); 

    } 
} 

答えて

3

いいえ。間違っています。 MainThreadはまったく必要ありません。代わりにchildThread.join(1000)を呼び出す必要があります。

しかし、このアプローチにも問題があります。それは、子スレッドが何とか実行され続けることを意味します。

childThread.join(1000); 
childThread.interrupt(); 

をし、定期的にchildThreadであなたの子スレッドにそのような何かを実行します: - 通常約

if (interrupted()) { 
    return; 
} 

をし、必要な例外:InterruptedExceptionを処理 したがって、あなたは後に参加)もchildThread.interruptを(呼び出す必要がありますあなたが持っているwait()メソッド。方法だ

1

より一般的な(より良い)アプローチであれば私を導いてください。タスクを最大1秒間実行してから停止する場合は、Thread.interrupt()を使用します。そうしないと、スレッドは引き続き実行されます。実際のコードの構造に応じて、割り込みを伝播する必要があるかもしれないことに注意することが重要です。このコードは、1秒間お待ちしておりますので、

例は

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); 
      } 
     } 
    } 
} 
0

いいえ、これは、動作しませんし、スレッドが終了していない場合には、それだけになります。スレッドは引き続き実行されます。 thread.interrupt()を呼び出すと、スレッドが中断されます。または、例外をスローしてスレッドを停止し、スレッドに参加するように接続を終了します。

0

うん、私が見る唯一の問題はChildThreadリストである、私はあなたが実行したい場合にも、レースの条件に

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

を持っていないように、あなたがこのような同期メソッドを使用することをお勧めあなたがスレッドオブジェクトの割り込みメソッドを使用することをお勧めし、子スレッドで割り込み例外を捕まえるのを忘れないようにして、ログに不必要な例外がないようにしてください

関連する問題