2012-01-19 4 views
2

Есть ли способ реализовать wait(); (нестатический метод) в статическом контексте. Например:Как реализовать нестатический метод в статическом классе?

public static void getkeylist(List keylist){ 
    for (int i=0;i<keylist.size();i++){ 
     System.out.println(keylist.get(i)); 
     wait(1000); 
    } 
} 

Я получаю сообщение об ошибке «Нестатический метод wait (long) не может быть передан из статического контекста».

Пожалуйста, помогите мне решить мою проблему. Заранее спасибо.

+2

Вы можете только «подождать» на том, что вы «синхронизированы». На что вы синхронизированы? [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait) говорит, что «throws IllegalMonitorStateException» - если текущий поток не является владельцем монитора объекта «. –

ответ

4

Как насчет Thread.sleep(1000);

wait действительно используется для контроля потока, наряду с notify. Я думаю, вы запутались между именами методов.

+0

_ Большое спасибо. Я попробовал Thread.sleep (1000), но он требует throw InterruptedException. Благодаря_ – dmfrl

0

предположим, что ваш класс называют Foo, вы можете позвонить Foo.class.wait(1000), или же вы можете определить статический объект и вызвать метод ожидания на нем:

private static final Object lock = new Object(); 
... 

lock.wait(); 
+2

Вам нужно удерживать монитор объекта, на который вы вызываете 'wait', поэтому вам нужно иметь' synchronized (lock) {... lock.wait(); } '. Я бы не рекомендовал блокировать объект класса, потому что любой может получить блокировку без вашего ведома, что может привести к тупиковой ситуации. –

+0

@CameronSkinner определенно с вами на блоке синхронизации и точках блокировки. –

0

Создать нон статический объект класса метод и использовать его.

..... 
Foo foo = new Foo(); 
foo.wait(); 
..... 
+0

Выполнение этого прекратит текущую нить навсегда, потому что нить не может проснуться 'foo' –

Смежные вопросы