Переменная интерференция с потоками - PullRequest
1 голос
/ 02 марта 2011
Thread t1= new Thread(new Runnable() {
            public void run() {
                //perform Database stuff
            }
        });
t1.start();
initCache();//perform other Database stuff (Can this code be executed while thread 1 is running?)

Как я могу убедиться, что метод initCache вынужден ждать после окончания t1?

Ответы [ 4 ]

5 голосов
/ 02 марта 2011

Не запускать его в другом потоке для начала?

Вы могли бы вызвать t1.join(), но на самом деле, если вы хотите запустить задачу X, а затем задачу Y, просто запустите их в том же потоке ...

0 голосов
/ 02 марта 2011

Использование join () ?Шутки в сторону?Неужели 90-е вызвали, потому что они хотят вернуть свои средства низкоуровневой синхронизации?

А что-то более высокоуровневое?Как CountDownLatch?

final CountDownLatch cdl = new CountDownLatch(1);
Thread t1= new Thread(new Runnable() {
            public void run() {
                //perform Database stuff
                cdl.countDown();
            }
        });
t1.start();
cdl.await();
initCache();

Может также быть настроен с таймаутом и т. Д.

0 голосов
/ 02 марта 2011
while (t1.isAlive()) {
  try {
    Thread.currentThread().sleep();
  }
  catch (InterruptedException e) {
    //check again
  }
}
initCache();

Это должно сделать это. Хотя на самом деле метод t1.join() чертовски прост.

0 голосов
/ 02 марта 2011

Если вы хотите, чтобы initCache() запускался только после того, как t1 завершил работу, тогда зачем начинать t1 с самого начала?

Просто выполните код в run(), а затем initCache().

Если между t1.start() и initCache() происходит какое-то другое действие, вы можете использовать t1.join(), чтобы дождаться завершения t1 перед вызовом initCache().

...