-2

以下のように宣言されているメソッドがいくつかあります。

このクラスは、コンテナからコンポーネントThreadLocalを取得するために使用するために宣言されています。Service

public class ThreadContext {
    private Connector connector;
    private static ThreadLocal threadLocal = new ThreadLocal() {        
        @Override
        protected Connector initialValue() {
            Service service =  
                   (Service) Container.getComponentInstanceOfType(Service.class);
            Connector connector = service.getConnector();  
            return connector;
        }
    };

    public static Connector get() {
        return Connector threadLocal.get();
    }
}

中流Connector階級です

public class Connector {
    public Collection<Result> search() {
        User user = ConversationUser.getCurrent()
    }
}

も使用するConversationUserことが宣言されていますThreadLocal

public class ConversationUser {
    private static ThreadLocal<ConversationUser> current = 
                                            new ThreadLocal<ConversationUser>();

    public static ConversationUser getCurrent() {
        return current.get();//(1)
    }
}

次に、以下のように何かをするスレッドを書きます。

Thread thread = null;
thread = new Thread(new Runnable() {
    public void run(){
        ThreadContext context = new ThreadContext();          
        Collection<Result> result = context.get().search();//(2)
        resultsTemp.put("File", result);
    }
});          
thread.start();

このスレッドは正常に機能しますがNullPointerException、行 (2) で発生します。私が調査したように、メソッドは行(1)で null を返します。

それは私にとって本当に混乱しています。問題が発生する理由がわかりません。これについていくつか説明をお願いします、ありがとう。

4

2 に答える 2

4

のように、オーバーライドするために匿名で拡張せずに初期化ConversationUser.currentしています。このため、が最初に呼び出されたときに、どのようにデータを設定するかを指定するものは何もありません。手動で入力するためのコード呼び出しがないため、が返されます。new ThreadLocal<ConversationUser>()initialValue()ThreadContext.threadLocalgetsetgetnull

詳細ThreadLocalと役立つ例については、javadoc を参照してください。

于 2013-06-06T03:22:19.083 に答える