Мне нравится заключать Дзэн Peters в кавычки Python. "Явный лучше, чем неявный".
В Java и C++, 'this.
' может быть выведен, кроме тех случаев, когда у Вас есть имена переменной, которые лишают возможности выводить. Таким образом, Вы иногда нуждаетесь в нем и иногда делаете нет.
Python выбирает делать вещи как это явными, а не на основе правила.
Кроме того, так как ничто не подразумевается или предполагается, части реализации представлены. self.__class__
, self.__dict__
и другие "внутренние" структуры доступны очевидным способом.
Используйте java.util.concurrent.CountDownLatch и не завершайте первый поток, пока второй не сообщит о завершении чтения из канала.
Обновление: быстрое и грязное код для иллюстрации моего комментария ниже
final PipedInputStream pin = getInputStream();
final PipedOutputStream pout = getOutputStream();
final CountDownLatch latch = new CountDownLatch(1);
InputStream in = new InputStream() {
@Override
public int read() throws IOException {
return pin.read();
}
@Override
public void close() throws IOException {
super.close();
latch.countDown();
}
};
OutputStream out = new OutputStream(){
@Override
public void write(int b) throws IOException {
pout.write(b);
}
@Override
public void close() throws IOException {
while(latch.getCount()!=0) {
try {
latch.await();
} catch (InterruptedException e) {
//too bad
}
}
super.close();
}
};
//give the streams to your threads, they don't know a latch ever existed
threadOne.feed(in);
threadTwo.feed(out);
Вы закрываете свой PipedOutputStream
, когда поток, который его использует, завершается? Вам необходимо сделать это, чтобы байты в нем были сброшены в соответствующий PipedInputStream
.
PipedInputStream
and PipedOutputStream
are broken (with regards to threading). They assume each instance is bound to a particular thread. This is bizarre. I suggest using your own (or at least a different) implementation.