Когда разные потоки обращаются к статическому методу, объекты, объявленные в этом методе, локальны или совместно используются в Java - PullRequest
5 голосов
/ 23 марта 2012

Когда разные потоки обращаются к статическому методу, объекты, объявленные в этом методе, локальны или совместно используются потоками в Java?

Кроме того, безопасно ли вызывать thread.interrupt() в потоке, который выполняет ввод / вывод?

Ответы [ 7 ]

8 голосов
/ 23 марта 2012

Объекты, объявленные в методе static, не являются общими для потоков. Объекты, определенные вне метода как static, являются общими.

Итак:

private static Object thisIsShared;

public static void myMethod() {
    Object thisIsNotShared = new Object();
}

Если вы собираетесь вызывать interrupt() в потоках, выполняющих ввод / вывод, вам следует рассмотреть использование классов, которые реализуют InterruptableChannel интерфейс .

2 голосов
/ 23 марта 2012

Относительно прерывания () ->

Это зависит от того, как вы собираетесь обрабатывать прерывания в потоке ввода-вывода.Несмотря на свое имя, interrupt () делает только передачу сообщения о прерывании в указанный поток.Это не означает прекращение работы как можно быстрее.Получающий поток увидит это сообщение и вызовет InterruptedException.Как он будет реагировать на ситуацию, находится в его полном распоряжении.Он может проигнорировать это, перезапустить себя, выключить, что угодно.

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

1 голос
/ 25 марта 2012

Переменные, объявленные в статическом или нестатическом методе, не используются разными потоками.

1 голос
/ 23 марта 2012

Когда разные потоки обращаются к статическому методу, объекты, объявленные в этом методе, локальны или совместно используются потоками в java?

Объекты, объявленные в любом методе, являются локальными для метода.Не имеет значения, является ли метод статическим или каким-либо другим.

1 голос
/ 23 марта 2012

Безопасно вызывать thread.interrupt() в потоке, который выполняет ввод / вывод, если ввод / вывод выполняется в прерывистом канале .

Если этот поток заблокирован в операции ввода-вывода для прерываемого канала, то канал будет закрыт, состояние прерывания потока будет установлено, и поток получит исключение ClosedByInterruptException.

Согласно java.lang.Thread

1 голос
/ 23 марта 2012

правильный ответ: статический или нестатический, это не имеет значения.

локальные переменные всегда локальны для этого вызова метода, независимо от того, является ли метод статическим или нет.они распределяются в стеке и выталкиваются из стека (и не имеют значения) после выхода из метода.

Что касается второго вопроса, прочитайте документы,

http://developer.android.com/reference/java/lang/Thread.html

если вы используете неблокирующий ввод-вывод, тогда да, вызов interrupt() может иметь смысл в зависимости от того, что вы ожидаете (опять же, прочитайте документы).если вы делаете блокировку ввода-вывода, вызов interrupt() не будет иметь никакого эффекта.

1 голос
/ 23 марта 2012

Переменные, объявленные в статическом методе, НЕ разделяются между потоками.Когда статический метод не изменяет какие-либо статические или иным образом совместно используемые объекты, он является потокобезопасным - это означает, что метод может вызываться несколькими потоками, и ничего плохого не произойдет.

Глядя здесь , многовсе может пойти не так при прерывании потока.Но не похоже, чтобы поток вызывал статический метод, это один из них.Я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...