2

我是java.util.concurrent包的新手,我遇到了Future對象的問題。Java EE Future NullPointer

這是一個conversationScoped bean。

@Inject SomeBean stateFull; 

Boolean comp = false, comp1 = false; 

public void doSomething(){   

    stateFull.runProcess(); 

    try { 

     comp = stateFull.getFuture().get();  
     System.out.println("Future "+syncEJB.getFuture().get()); 
     updateView(); 

     comp1 = stateFull.getFuture1().get(); 
     System.out.println("Future "+syncEJB.getFuture().get()); 
     updateView(); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(SynchronizationMB.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (ExecutionException ex) { 
     Logger.getLogger(SynchronizationMB.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 

SomeBean看起來像這樣。

@Stateful 
public class SomeBean{  

    @Inject AnotherBean stateLess; 

    private volatile Future<Boolean> future, future1; 

    @Asynchronous 
    public void runProcess(){ 
     future = stateLess.compute(); 
     future1 = stateLess.compute(); 

    } 
    public Future<Boolean> getFuture() { 
     return future; 
    } 
    public Future<Boolean> getFuture1() { 
     return future1; 
    } 
} 

而且AnotherBean:

@Stateless 
public class AnotherBean{ 

@Asynchronous 
public Future<Boolean> compute() { 
    boolean result; 


    System.out.println("--------------"); 
    System.out.println("completed sync"); 
    System.out.println("--------------"); 

    result = true; 

    return new AsyncResult<Boolean>(result); 
} 
} 

而現在我的問題。我打電話doSomething()方法,我認爲根據Future.get()文檔應該調用runProcess()和比
comp = stateFull.getFuture().get();
等到未來SomeBean從AnotherBean完成,但它只是不停地扔NullPointerException。任何人都知道它爲什麼會發生?

-------------------編輯-----------------------

NullPointer已更正。現在我有另一個問題。假設我通過調用runProcess()中的更多方法在Somebean中設置更多Future對象。然後,我希望每當Future對象獲得結果以查看進度時更新我的​​頁面。我怎麼做?現在我使用

private void updateView(){ 
    RequestContext ctx = RequestContext.getCurrentInstance(); 
    ctx.update("mainFrm:info"); 
} 

在doSomething()方法中的每一個布爾值下,但它沒有做我想做的事。所有的布爾一次只出現一次。

+0

你爲什麼不簡單定義:'public Future runProcess(){return stateLess.compute(); },這個額外變量的目的是什麼? – 2012-08-17 11:38:14

+0

因爲我將在runProcess()中調用更多類似的方法,目前只有一個用於測試目的,與conversationScoped bean中的布爾值相同,將會有更多 – 2012-08-17 11:44:45

+0

首先查找哪個值爲null,查看堆棧跟蹤:is在stateFull.runProcess()或stateFull.getFuture()。get()? – 2012-08-17 11:49:45

回答

3

NPE發生是因爲啓動新線程是一項沉重的操作,並且當您調用stateFull.getFuture().get();時,新線程尚未啓動(因此功能爲空)。

Here使用@Async與未來的正確方法。

+0

好主意,但看起來不是問題的根源。我嘗試在此Asynchronous調用的SomeBean中設置Thread this對象this this this = this.readThread = Thread.currentThread();並且循環檢查,直到它在conversationScoped bean中存活,但nullPointer仍然爲 – 2012-08-17 12:14:32

+0

「future」字段必須至少爲volatile ' - 因爲它在不同的線程中更新和獲取。 – ice 2012-08-17 12:46:22

+0

好吧,現在它停止拋出NPE但IllegalStateException異常開始。 '對象不代表一個殘酷的未來' – 2012-08-17 13:31:50