Каждый объект JavaScript имеет внутреннее свойство с именем [[Prototype]] . Если вы просматриваете свойство с помощью obj.propName
или obj['propName']
, и у объекта нет такого свойства - что можно проверить с помощью obj.hasOwnProperty('propName')
- среда выполнения вместо этого ищет свойство в объекте, на который ссылается [[Prototype]] , Если объект-прототип также не имеет такого свойства, его прототип проверяется по очереди, таким образом обходя цепочку прототипов исходного объекта , пока не будет найдено совпадение или пока не будет достигнут его конец.
Некоторые реализации JavaScript обеспечивают прямой доступ к свойству [[Prototype]], например, через нестандартное свойство с именем __proto__
. В общем, установить прототип объекта можно только во время создания объекта: если вы создаете новый объект через new Func()
, свойство объекта [[Prototype]] будет установлено на объект, на который ссылается Func.prototype
.
Это позволяет имитировать классы в JavaScript, хотя система наследования JavaScript, как мы уже видели, является прототипной, а не основанной на классах:
Просто представьте функции конструктора как классы и свойства прототипа ( т. е. объекта, на который ссылается свойство функции конструктора prototype
) в качестве общих членов, то есть членов, которые одинаковы для каждого экземпляра. В системах на основе классов методы реализуются одинаково для каждого экземпляра, поэтому методы обычно добавляются в прототип, тогда как поля объекта зависят от экземпляра и, следовательно, добавляются к самому объекту во время построения.
Thread.interrupt() should be the method you're looking for. Be sure that your input-accessing methods also check for InterruptedException and ClosedByInterruptException.
Also look at the corresponding page in the Sun Concurrency Tutorial, as another solution suggests.
You could simply close() the IO stream/socket from another thread. Then, you could check on a volatile boolean field if the resulting IOException is due the close or something else. I think the close might result in an java.net.SocketException: Socket closed
exception.
Sockets allow to set a timeout via the setSoTimeout()
method. This is the preferred way to stop them blocking.
Otherwise you might want to have a look at the nio
package which allows for non-blocking I/O at the expense of more manual work to manage incoming and outgoing data.