Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在线程完成其工作后返回一个值_Java_Multithreading - Fatal编程技术网

Java 在线程完成其工作后返回一个值

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) {

我试图用线程在java中实现观察者模式。我试图做的是从新线程返回一个值

在这里,有人建议使用Observer模式,我想使用它

我有以下代码:

/*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;
}