从Java中的两个线程访问共享变量
我正在用Java构建一个应用程序,它需要从两个类的实例访问Hashtable并扩展线程。我已经在两个类中的一个中声明了Hashtable。当我尝试从其中一个类访问Hashtable内容时,我总是得到null。另一个类可以毫无问题地访问内容。我认为这是并发控制的问题。由于这些是不同类的线程,因此我们无法使用同步方法。有没有办法让Hashtable可以从两个类的线程访问?
以下是我的应用程序代码的一些部分
这是存储HashMap的类:
public class DataStore {
public Map ChatWindows ;
public DataStore()
{
ChatWindows = new ConcurrentHashMap();
}
public synchronized void putWindow(String with,ChatWindow t)
{
ChatWindows.put(with,t);
notifyAll();
}
public synchronized ChatWindow getWindow(String with)
{
notifyAll();
return (ChatWindow)ChatWindows.get(with);
}
public synchronized void ChatWindowOpen(chatClient cc,String with,String msg)
{
// chatWith = with;
ChatWindow t;
System.out.println(with);
t = getWindow(with);
if(t == null)
{
t = new ChatWindow(cc,with,msg);
// th = new Thread(t);
putWindow(with, t);
// th.start();
}
else
{
t.setVisible(true);
}
}
}
两个访问'ChatWindows'HashMap的类
public class chatClient extends javax.swing.JFrame implements
Runnable,ListSelectionListener,MouseListener,WindowListener{
static String LoginName,chatWith,msgToChatWindow;
Thread listThread=null,th,chatListen;
static Socket soc;
static DataOutputStream dout,dout1;
static DataInputStream din,din1;
DefaultListModel listModel;
ChatWindow t;
public DataStore ds;
/** Creates new form chatClient */
public chatClient(Login l,DataStore ds) {
listModel = new DefaultListModel();
initComponents();
clientList.addListSelectionListener(this);
clientList.addMouseListener(this);
addWindowListener(this);
this.LoginName=l.loginName;
soc = l.soc2;
din = l.din2;
dout = l.dout2;
dout1 = l.dout1;
din1 = l.din1;
super.setTitle(LoginName);
listThread = new Thread(this);
listThread.start();
this.ds = ds;
}
.
.
.
.
public void mouseClicked(MouseEvent e)
{
chatWith = (String)clientList.getSelectedValue();
ds.ChatWindowOpen(this,chatWith,"");
}
这个类也有run()方法,但是它不使用HashMap。这个类能够正确访问'ChatWindows'。'ChatListenThread'类无法正确访问HashMap的内容。
public class ChatListenThread implements Runnable{
DataOutputStream dout1;
DataInputStream din1;
public static chatClient cc;
public static ChatWindow t;
public DataStore ds;
public ChatListenThread(Login l,DataStore ds)
{
din1 = l.din1;
dout1= l.dout1;
this.ds = ds;
}
.
.
.
.
public void run(){
while(true)
{
try{
String msgFromServer=new String();
msgFromServer = din1.readUTF();
StringTokenizer st=new StringTokenizer(msgFromServer);
String msgFrom=st.nextToken();
String MsgType=st.nextToken();
String msg = "";
while(st.hasMoreTokens())
{
msg=msg+" " +st.nextToken();
}
ds.ChatWindowOpen(cc,msgFrom,msg);
}
catch(IOException e)
{
System.out.println("Read failed");
}
}
}
}
没有找到相关结果
已邀请:
2 个回复
素汞读
诉嘎归亮
创建一个空的
并启动一个连接到
的线程 当输入进入插座时,创建一个
(~
)并将其添加到其中一个选项卡 将
添加到处理来自“
”的消息的
将消息传递给新创建的
所以我这样做了,我发布下面的代码!希望你能用它! 如果你想测试它,首先启动
(下面的代码),然后启动
。 这是客户端的代码
这是测试服务器的代码: