Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 将对象传递给实现runnable的类的目的_Java_Multithreading_Runnable - Fatal编程技术网

Java 将对象传递给实现runnable的类的目的

Java 将对象传递给实现runnable的类的目的,java,multithreading,runnable,Java,Multithreading,Runnable,有三节课 调用打印消息的基本类 调用方实现Runnable,并从主类Synch获取对象 同步为CallMe创建对象的主类,并将其传递给类调用方类,然后启动线程。 问题: 在Synch类中,将对象传递给类调用方需要什么?当我尝试在没有CallMe对象的情况下调用类调用者时,编译器抛出一个NullPointerException。你能提供这种行为的任何原因吗 例如:调用方ob1=新调用方Hello;//调用时没有CallMe类的对象 以下是工作代码供参考 public class CallMe {

有三节课

调用打印消息的基本类 调用方实现Runnable,并从主类Synch获取对象 同步为CallMe创建对象的主类,并将其传递给类调用方类,然后启动线程。 问题: 在Synch类中,将对象传递给类调用方需要什么?当我尝试在没有CallMe对象的情况下调用类调用者时,编译器抛出一个NullPointerException。你能提供这种行为的任何原因吗

例如:调用方ob1=新调用方Hello;//调用时没有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");
        }
    }
}
调用者ob1=新调用者Hello

首先,这将是一个编译时错误,因为您没有只接受字符串作为参数的调用方构造函数

当我在没有CallMe对象的情况下调用类调用者时,编译器抛出null指针异常

我假设您打算按如下方式创建调用方:

Caller ob1 = new Caller(null, "Hello"); 
如果是这样,NPE将由您的run方法抛出,该方法将由调用方构造函数中的thread.start调用自动调用。调用者的任务似乎是在单独的线程中运行CallMe函数,因此传递给它的CallMe对象必须是非null值。NPE的原因是您的案例中缺少有效的CallMe对象


HTH.

由于行的原因,编译器抛出NullPointerException

target.call(msg)
如果将null传递给调用方构造函数,那么实例变量target将设置为null,并且您正在对null引用调用一个方法,因此是NullPointerException

至于为什么您需要一个“Caller”和一个“CallMe”类,这只是风格的问题。其思想是为代码可能包含的任何业务逻辑创建一个可运行的“包装器类”。这样,线程就不会绑定到项目的核心中。

调用方内部的CallMe对象目标未初始化,因此在调用构造函数Callertarget XXX进行初始化之前,该对象具有空值。当调用的对象的值为null时,总是会出现null指针异常

如果您使用CallerXXX而不传入CallMe对象,则调用方对象内的目标将不会被初始化