Объект, расположенный в основном потоке, не инициализируется другим потоком - PullRequest
0 голосов
/ 03 мая 2020

Я собрал класс клиентского приложения, которое должно подключаться к сокету, и оно должно автоматически получать DefaultTreeModel с сервера или простой объект String в качестве теста. Проблема в том, что внутри основного RemoteNetworking класса DefaultTreeModel или String успешно получены, но если я пытаюсь получить их, используя getClientTreeModel() или verifiFromOutside, я получаю только нулевые объекты. Можете ли вы помочь мне понять это поведение? Я поставлю код ниже.

package Networking;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class RemoteNetworking extends Thread{

    private volatile Socket remoteSocket;
    private volatile boolean isRunning = true;
    private Thread currentThread;
    private volatile ObjectOutputStream oos;
    private volatile ObjectInputStream ois;
    private volatile DefaultTreeModel treeModel = null;

    private String IP;
    private int port;
    private static volatile String test;

    public RemoteNetworking(String IP, int port) {
         this.IP = IP;
         this.port = port;
    }


    public void connect() {
        try {
            SocketAddress socketAddress = new InetSocketAddress(IP, port);
            remoteSocket = new Socket();
            remoteSocket.connect(socketAddress);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private synchronized void setReceivedTreeModel(DefaultTreeModel receivedTreeModel) {
        this.treeModel = receivedTreeModel;
    }

    public synchronized void disconnect() {
        try {

            //oos.writeObject("Disconnect");
            oos.flush();
            //oos.close();
            isRunning = false;
            remoteSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public synchronized DefaultTreeModel getClientTreeModel() {
        return treeModel;
    }

    public synchronized void verifyFromOutside() {
            System.out.println(test);   
    }

    @Override
    public void run() {

        connect();

        synchronized(this) {
            this.currentThread = Thread.currentThread();
        }

        try {
            ois = new ObjectInputStream(remoteSocket.getInputStream());
            oos = new ObjectOutputStream(remoteSocket.getOutputStream());
            oos.writeObject("DataTree");
            oos.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        while(isRunning) {

            try { 
                   Object object = (Object)ois.readObject();

                    /*if(object instanceof DefaultTreeModel) {
                        //this received object is not null
                        setReceivedTreeModel((DefaultTreeModel)object);
                        if(treeModel==null) {
                            System.out.println("Null object in RemoteNetworking");
                        }
                        verifyFromOutside();
                    }*/

                   if(object instanceof String) {

                           this.test = (String)object;
                           System.out.println(test);       
                   }
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }



    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...