2015-08-29 2 views
3

У меня есть 2 потока, работающих одновременно. Если вы пройдете через ряд циклов и т. Д. Первый поток, который достигнет конца своих вычислений, я вызываю метод. Я хотел бы знать, может ли этот метод прервать все другие потоки .. или заблокировать их, так что только первый поток для вызова этого метода будет запускать этот метод.JavaSE: Первый поток для вызова метода прерывает все остальные потоки

EDIT полагал, что я брошу в качестве примера:

Класс, который создает темы:

class Runner extends Thread{ 

    public void run(){ 
     //for loops 
      //math, math, math 
     // while 
      // random numbers, math 
     // yada yada 

     methodCall(); 
    } 
} 

methodCall() в рамках основного метода

public static *synchronized perhaps* void methodCall(){ 
    //first call wins 
    //interrupt all other threads created 
} 
+0

Может нить группа содержала эти нити является ok.hope, что помогло, для более подробной информации, пожалуйста, обратитесь http://www.javaworld.com/article/2074481/java -concurrency/java-101 - understanding-java-threads - part-4 --- thread-groups - volatility - and-threa.html – Javy

ответ

2

Да, вы можете сделать это. Сделайте метод synchronized, чтобы он мог запускаться только одним потоком за раз, а внутри метода установлен флаг, который приведет к прекращению будущих прогонов метода.

Примечание: если метод представляет собой метод экземпляра, а не статический метод, а разные потоки используют разные экземпляры класса, в котором находится этот метод, вам необходимо синхронизировать глобальную блокировку, такую ​​как статический Object в класс.

+0

Отлично .., который заботится о блокировке .. Я решил, что было бы легко .. но как насчет прерывания других потоков, чтобы они перестали вычислять и изящно заканчивались? – Podis

+0

Если вы хотите остановить другие потоки, это займет больше кода. Вы должны иметь код, выполняемый всеми потоками, который проверяет флаг, вероятно, volatile boolean, периодически, чтобы проверить, завершился ли первый поток, и если он имеет, изящно прекратить обработку потока, проверяющего флаг. Затем синхронизированный метод устанавливает флаг для указания завершения первого потока. Если, вероятно, другие потоки ждут блокировок, вы можете вызвать прерывание() на них, чтобы они отказались от своих ожиданий. –

+0

Вы также можете вызвать Thread.stop() для всех других потоков, но это не рекомендуется и не рекомендуется. –

0

Попробуйте покончить со своими конкурентами потоками с вызовом метода synchronized, который устанавливает значение некоторой нулевой инициализируемой переменной. Победитель вызовет метод и получит блокировку, найдет значение null и определит его имя. Проигравший получит следующий бит блокировки, чтобы найти имя победителя, которое уже установлено.

public class RaceJudge 
{ 
    private static Runner m_tskWinner = null ; 

    /** 
    * The "methodCall()" from the question. 
    * @param tskCompetitor the Runner that is trying to cross the 
    * line. 
    * @return true if that task won the race. 
    */ 
    public static synchronized boolean crossFinishLine(Runner tskCompetitor) 
    { 
     if(m_tskWinner == null) 
     { 
      m_tskWinner = tskCompetitor ; 
      return true ; 
     } 
     else 
      return false ; 
    } 
} 

Таким образом ...

public class Runner extends Thread 
{ 
    @Override 
    public void run() 
    { 
     // the aforementioned yadda yadda 
     RaceJudge.crossFinishLine(this) ; 
    } 
}