2017-03-03 21 views
1

イム種類を中断/新しいスレッドと殺害を作成できませんし、ちょうどグループプロジェクトで問題に遭遇したアイブ:Javaのスレッド:古いスレッドにJavaスレッドへの新規の

//編集:プログラムはJFrameのですプロパティファイルの変更をロードするために一種の「再起動」が必要です。

いくつかのプロパティを変更できるプログラムがあります。変更を有効にするために 、プログラムは再起動を必要とする/新しいJVMでの新しい打ち上げは(私には思える?)

問題は、以下の通りです:

私はすでにactualy我々のプログラムを起動するスレッドを作りました後で変更すると、新しいスレッドを作成するためのプログラムが起動します。これは動作していますが、古いスレッドを強制終了できません。そして、私がそれをしようとすると( "X"またはプログラムで)私は同時に両方のインスタンスを殺します。 実際には2つのスレッドはありませんか? - そうでなければ、彼らは別々に扱われなければならないのですか?

一方、Thread.currentThread().interrupt()を使用すると、両方のインスタンスが残りますが、文字通り何もできません。

スレッドスターター:

public static void createNewInstance() { 
prog = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       //loading propertie data into String[] array.. 
       Start.main(String[] array); 
       while (true) { 
         if (!isRunning) { 
          currentThread().interrupt(); 
          createNewInstance(); 
          isRunning = !isRunning; 
         } 
       } 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    }; 
    new Thread(prog).start(); 
} 

と変更イベントでこのよう

 MyThread.isRunning = false; 
     Thread.currentThread().interrupt(); 

は私にとって新しいものであると私は、あらゆる種類のための感謝、このIMを達成する方法を見つけ出すことはできません私がこれまでに作った何らかの間違いやアドバイスの (ご迷惑をおかけして申し訳ありません。ネイティブスピーカーではありません)

ありがとうございます!

----回避策ソリューション:propertie変更は新しい言語設定に関連していた私の場合は----

:DE - > EN
マイメッセージ:
public class Messages { private static String bundle_name = "com.ttr.language.messages" + new PropertiesClass().getProperty("lang"); //$NON-NLS-1$ private static ResourceBundle resource_bundle = ResourceBundle.getBundle(bundle_name);

は、それから私は、メッセージクラスにこのメソッドを追加しました:

public static void updateProperties(String language) { bundle_name = "com.ttr.language.messages" + language; resource_bundle = ResourceBundle.getBundle(bundle_name); }

は、そして、私のプログラムでそれを使用:

props.setProperty("lang", "EN"); < - 例 Messages.updateProperties(props.getProperty("lang"));
//dispose window and start login

+0

あなたが実際に現在のスレッド、中断を期待するかもしれないものを中断する。正しく中断するには、 'createNewInstance()'で作成したスレッドのインスタンスが必要です。 –

+0

また、自分自身を中断するためにスレッドを必要としないと確信しています。 Runnableの本体から離れるようにするだけで、正常に停止します。 –

+0

こんにちは、速い返信をいただきありがとうございます!私は変更イベントにすべてを渡す必要がありますか?私たちはたくさんのクラスを静かにしています...あるいは、私は 'getInstanceOf(MyThread).currentThread()'のようなことをすることができますか? – Slajoc

答えて

1

のはXThreadは変更はあなたが停止するterminateThread()を呼び出すことができますトリガされ、あなたのfunctionality.Whenを実装したスレッドであるとしましょう新しいスレッドを新しいプロパティで実行するにはgetInstance()を呼び出します。

class XThread implements Runnable{ 

     private static Thread rT = null; 
     private XThread() 
     {} 
     public static void terminateThread() 
     { 
      rT = null; 
     } 

     public static Thread getInstance() 
     { 
      if(rT==null) 
      { 
       rT = new Thread(new XThread()); 
      } 
      return rT; 
     } 

     public void run() 
     { 
     //whatever functionality you want to add 
     } 
    } 

希望はこのことができます:)

+0

こんにちは、ありがとう。たぶん私は間違ってsthをやっているが、私はこれを動作させることはできません。 imをsthのように使用している場合 'public void run(){ System.out.println(" start "); Thread.sleep(5000); System.out.println( "exit"); terminateThread(); ' ちょうどチャームのように機能し、印刷終了直後に終了します。 しかし、私のプログラムを最初の 'System.out.println(" start ");の代わりに起動しようとすると、プログラムが実行され、' Thread.sleep() 'が実行されますが、その後私のプログラムは終了しません。 ? – Slajoc

+0

このようにしてください... https://jpst.it/UMR2。不適切な押し込みを許してください。あなたのGUIコードを実行するために '' SwingUtilites.invokeLater() '' 'を使っていますか? –

+0

役に立つリンクhttp://stackoverflow.com/questions/3551542/swingutilities-invokelater-why-is-it-needed –