Java 在线程完成其工作后返回一个值
我试图用线程在java中实现观察者模式。我试图做的是从新线程返回一个值 在这里,有人建议使用Observer模式,我想使用它 我有以下代码:Java 在线程完成其工作后返回一个值,java,multithreading,Java,Multithreading,我试图用线程在java中实现观察者模式。我试图做的是从新线程返回一个值 在这里,有人建议使用Observer模式,我想使用它 我有以下代码: /*Observable*/ public class QRExplorer extends Observable implements Runnable { private String md5; public String getMD5() { return md5; } private void setMD5(String value) {
/*Observable*/
public class QRExplorer extends Observable implements Runnable {
private String md5;
public String getMD5()
{
return md5;
}
private void setMD5(String value)
{
this.md5 = value;
setChanged();
notifyObservers();
}
@Override
public void run() {
// do some stuff
// here I should obtain a string and I want return that
setMD5("value");
}
}
/*Observer*/
public class Observador implements Observer {
private QRExplorer observado = null;
public Observador(QRExplorer observado)
{
this.observado = observado;
}
@Override
public void update(Observable o, Object arg) {
if(o == observado)
{
System.out.println("Something has changed ¬¬: "+observado.getMD5());
}
}
}
/*Principal class*/
public class MainView extends javax.swing.JFrame implements ThreadFactory{
private RKeyListener listener;
private Webcam camara;
private Executor creador = Executors.newSingleThreadExecutor(this);
private Observador observador;
private QRExplorer explorer;
/*Nothing relevant*/
private void pCamaraMouseClicked(java.awt.event.MouseEvent evt) {
creador.execute(explorer);
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
Observable obs = (Observable)t;// but Netbeans tells me: incompatible types: Thead cannot be converted to Observable
obs.addObserver(observador);
return t;
}
}
试一试
它可以编译但不能工作,因为将返回的线程不是QRExplorer的新实例。@Bob如果要控制Runnable,为什么要使用ThreadFactory?您可以使用新的Threadexplorer。@Bob我想您应该在creador.executeexplorerI中创建并执行线程。我想我解决了我的问题。正如您建议我不再使用ThreadFactory而不是修改QRExplorer类,我添加了以下方法:public void setobserveQRExplorer o{this.observado=o;}在“pcamamouseclicated”的内部,我放了这样一个词:threadt=newthreadexplorer;explorer.addObservator;observator.setobserveexplorer;t、 开始;好啊实际上,当您使用构造函数ObservadorQRExplorer时,您隐式地拥有setObservable
@Override
public Thread newThread(Runnable r) {
explorer = new QRExplorer(); // extends Observable
observador = new Observador(explorer); //implements Observer
explorer.addObserver(observador);
Thread t = new Thread(r);
return t;
}