位于主线程的对象未被另一个线程初始化。

huangapple 未分类评论47阅读模式
英文:

Object located in the main thread is not initialized by another thread

问题

我组合了一个客户端应用程序的类,它应该连接到一个套接字,并且应该自动从服务器检索一个DefaultTreeModel或一个简单的字符串对象作为测试。问题是,在主要的RemoteNetworking类内部,DefaultTreeModel或字符串成功地被接收,但是如果我尝试使用getClientTreeModel()verifyFromOutside来获取它们,我只得到空对象。你能帮我理解这种行为吗?我将在下面放置代码。

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();
                }
        }



    }

}
英文:

I put together a class of an client app that should connect to a socket and it should automatically retrieve a DefaultTreeModel from the server or a simple String object as a test. The issue is that inside the main RemoteNetworking class the DefaultTreeModel or the String are successfully received but if I try to get them using getClientTreeModel() or verifiFromOutside i'm getting only null objects. Can you please help me understand this behavior? I'll place the code bellow.

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();
				}
		}
		
		
		
	}

}

huangapple
  • 本文由 发表于 2020年5月4日 02:55:43
  • 转载请务必保留本文链接:https://java.coder-hub.com/61579985.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定