是否正在使用连接等待一个Thread完成与使用观察者在线程完成时通知调用线程类相同的内容?
Using join -
public class Reader {
Thread t = new Thread(new ReadContent());
t.start();
t.join();
System.out.println("Thread has finished");
public class ReadContent() implements Runnable{
}
public void run() {
readContentURL();
}
}
/*****************************************************************************/
Using observer -
public interface ReadContentListener{
public void contentRead();
}
public class Reader implements ReadContentListener {
Thread t = new Thread(new ReadContent(this));
t.start();
pubic void contentRead(){
System.out.println("Thread has finished");
}
public class ReadContent implements Runnable{
public ReadContent(ReadContentListener readContentListener) {
this.readContentListener = readContentListener;
}
public void run() {
readContentURL();
this.readContentListener.contentRead();
}
}
/*************************************************************/
public GenericScreenAnimation(String nextScreen, Thread genericWorkerThread)
{
this.genericWorkerThread = genericWorkerThread;
this.genericWorkerThread.start();
initialise();
try {
this.genericWorkerThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
ScreenController.displayNextScreen(nextScreen);
}
答案 0 :(得分:4)
观察者模式是关于通知其他对象,而不是其他线程。 如果读数已完成,您的ReadContentListener将在阅读主题中通知。 在此期间的原始线程将继续它自己的工作(或完成,如果没有)。
使用Thread.join使原始线程简单地阻塞,直到读取线程结束。
你通常不会直接在.start()
之后使用它,但只有在原始线程上还有其他事情要做,这应该与读数并行完成。在.start()
之后直接调用此函数(对于效果)相当于在原始线程上执行读取。
答案 1 :(得分:1)
使用Observer模式是异步的,如果你在UI代码中这样做,我将用它来阻止GUI锁定(好吧,也许使用SwingWorker或类似的东西,但原理相同)。
答案 2 :(得分:1)
一般情况下它是相同的,因为在线程中不会再执行任何语句,但有一些要点:
join
返回时,保证线程完成,但通知观察者线程仍在运行时join
之后你在主(或父)线程中,用观察者你在线程即将完成。