2017-10-07 10 views
-2
private static final Word2Vec word2vectors = getWordVector(); 

    private static Word2Vec getWordVector() { 
     String PATH; 
     try { 
      PATH = new ClassPathResource("models/word2vec_model").getFile().getAbsolutePath(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     log.warn("Loading model..."); 
     return WordVectorSerializer.readWord2VecModel(new File(PATH)); 
    } 

     ExecutorService pools = Executors.newFixedThreadPool(4); 
     long startTime = System.currentTimeMillis(); 
     List<Future<?>> runnables = new ArrayList<>(); 
     if (word2vectors != null) { 
      for (int i = 0; i < 3000; i++) { 
       MyRunnable runnable = new MyRunnable("beautiful", i); 
       runnables.add(pools.submit(runnable)); 
      } 
     } 
     for(Future<?> task: runnables){ 
      try { 
       task.get(); 
      }catch(InterruptedException ie){ 
       ie.printStackTrace(); 
      }catch(ExecutionException ee){ 
       ee.printStackTrace(); 
      } 
     } 
     pools.shutdown(); 

static class MyRunnable implements Runnable{ 
     private String word; 
     private int count; 
     public MyRunnable(String word, int i){ 
      this.word = word; 
      this.count = i; 
     } 

     @Override 
     public void run() { 
       Collection<String> words = word2vectors.wordsNearest(word, 5); 
       log.info("Top 5 cloest words: " + words); 
       log.info(String.valueOf(count)); 
     } 
    } 

word2vectors.wordsNearest()は、公共図書館のメソッドです。私はプロセスを高速化するために4つのスレッドに同時にメソッドを実行させるつもりです。このスレッドは安全ですか?以下の条件が満たされた場合このコードは安全ですか?

+2

'wordsNearest'メソッドに依存します。 – Oleg

+0

もし私がwordsNearestを制御できないなら、どうすればこのコードを安全にすることができますか? – user697911

+1

他に何も知らないのであれば、 'wordsNearest'を呼び出すときに、一つのスレッドを使うか、' word2vectors'で同期させるだけです。 – Oleg

答えて

2

あなたのコードスニペットは、スレッドセーフになります。

  1. word2vectors.wordsNearest(...)コールはスレッドセーフword2vectorsデータ構造が作成され、現在のスレッドによって初期化され
  2. です。
  3. pools.execute呼び出しと計算終了の間のデータ構造は変更されません。

wordsNearest場合は、他のデータ構造を見ていない、そしてそれはword2vectorsデータ構造を変更しない場合は、それはそれは、スレッドセーフである合理的な仮定です。しかし、確実にする唯一の方法はです。それを分析するのはです。

ただし、実行者に1つのタスクしか提出していないことにも注意してください。各タスクは1つのスレッドで実行されるため、コードでは1つのスレッドしか効果的に使用しません。マルチスレッドを利用するには、単一の大きなタスクを複数の小さな独立したタスクに分割する必要があります。例えば実行呼び出しの外側に10,000回の繰り返しループを置く...

+0

これを例として、複数の小さなタスクに分割できますか? – user697911

+0

私はすでにそれを行う方法を教えています。私の答えをもう一度読んでください。 –

+0

あなたの提案であなたのコードを更新しました。それは安全ではないようです。私はword2vectors.wordsNearestのコントロールがないと仮定して、どうすればこのメソッドをスレッドセーフにすることができますか? – user697911

関連する問題