有3个班级。


CallMe打印消息的基本类
Caller实现Runnable并从主类Synch获取对象
SynchCallMe创建对象并将其传递给Caller类并启动线程的主类。


题:
Synch类中,将对象传递给Caller类有什么需要?当我尝试在没有Caller对象的情况下调用类CallMe时,编译器将引发NullPointerException。您能否提供这种行为的任何原因。

例如:Caller ob1 = new Caller("Hello"); // calling without an object of class "CallMe"

以下是工作代码以供参考。

public class CallMe {
    void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("]");
    }
}

class Caller implements Runnable {
    String msg;
    CallMe target;
    Thread t;

    public Caller(CallMe targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        target.call(msg);
    }
}

class Synch {
    public static void main(String args[]) {
        CallMe target = new CallMe();
        Caller ob1 = new Caller(target, "Hello");
        Caller ob2 = new Caller(target, "Synchronized");
        Caller ob3 = new Caller(target, "World");
        // wait for threads to end
        try {
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
    }
}

最佳答案

由于该行,编译器将引发NullPointerException

target.call(msg)


如果将null传递给Caller构造函数,则实例变量target将设置为null,并且您将在null引用上调用方法,因此将调用NullPointerException。

至于为什么需要同时拥有“ Caller”和“ CallMe”类,这只是样式问题。这个想法是为您的代码可能包括的任何业务逻辑创建一个Runnable的“包装器类”。这样,线程就不会绑定到项目的核心。

关于java - 将对象传递给实现可运行的Class的目的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13656297/

10-10 08:37