2015-02-22 5 views
1

Я новичок в OSGI, и у меня есть текущая цель. У меня есть 10 потоков, они записывают свои имена в файл. После записи потока sleep random 0..1 сек. Это все должно быть связкой. Я создаю его, но я не уверен, что это правильно. Могут ли какие-либо комментарии?OSGI bundle and threads

package helloworld; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import writer.StartThreads; 
public class Activator implements BundleActivator { 
    public void start(BundleContext context) throws Exception { 
     System.out.println("Start Thred!!"); 

     new StartThreads().Execute(); 
    } 

    public void stop(BundleContext context) throws Exception { 
     System.out.println("Goodbye World!!"); 
    } 
} 
package writer; 

import writer.WriterLogs; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

public class StartThreads { 

    public static void Execute() { 
     BufferedWriter writer = null; 
     File textFile = new File("threadLog.txt"); 
     // if file doesnt exists, then create it 
     if (!textFile.exists()) { 
      try { 
       textFile.createNewFile(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     try { 
      writer = new BufferedWriter(new FileWriter(textFile, true)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     for (int i = 0; i < 10; i++) { 
      WriterLogs wrt = new WriterLogs(writer); 
      Thread worker = new Thread(wrt); 

      worker.setName("Nisha-" + i); 
      worker.start(); 
      try { 
       worker.join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     try { 
      writer.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
package writer; 

import java.io.BufferedWriter; 
import java.io.IOException; 

public class WriterLogs implements Runnable { 

    private BufferedWriter writer; 

    public WriterLogs(BufferedWriter wr) { 
     this.writer = wr; 
    } 

    @Override 
    public void run() { 
     try   
     { 
      try { 
       synchronized(this.writer) { 
       this.writer.write(Thread.currentThread().getName() + "\n"); 
       } 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      // set random 0...1 s. 
      Thread.sleep((long)(Math.random() * 1000)); 
      System.out.println(Thread.currentThread().getName()); 
     }   
     catch (InterruptedException interruptedException)   
     {    
      /*Interrupted exception will be thrown when a sleeping or waiting     
      * thread is interrupted.     
      */     
      System.out.println(Thread.currentThread().getName() +interruptedException);    
     } 
    } 

} 
+1

Если этот код работает наилучшим образом, и вы хотите узнать об улучшениях, вы можете опубликовать его на странице [Обзор кода] (http://codereview.stackexchange.com/) – Hosch250

+0

Я бы сказал, что вы ** должны ** закрыть все ресурсы пакета на 'stop'. В настоящее время ваши потоки должны умереть сами по себе, но вы не можете принять это как должное в общем случае. –

+0

@ Борис Паук, что ты мне скажешь? Посмотрите, как я закрываю файл. – Fortran

ответ

3

Это не правильно. Как утверждает Борис Паук, когда ваш комплект останавливается, вы должны освободить любые ресурсы и прекратить любую обработку, выполняемую пакетом. Поэтому из метода stop вы должны как-то сигнализировать о том, чтобы ваши потоки останавливались, как только могли.

На практике вам может уйти с пуском кода, но это определенно не то, как вы должны писать свой код в OSGi (это то, что вы просите).

+0

Хорошо, в методе остановки я должен закрыть файл и остановить Thread? – Fortran

+0

Да. Ваш код должен делать это как можно быстрее, и метод остановки должен ждать его. –