让我尽量解释问题。我有一个主类,从这个主类,我创建一个套接字读写器。然后我创建一个Reader'runnable'并使用threadmanager启动线程。
// MainApp.java
public class MainApp{
public static void main (String[] args){
MainApp app = new MainApp();
app.setUpNetworking();
}
public void setUpNetworking(){
try{// try socket conn
ThreadManager();
}catch{ //catch errors}}
public void ThreadManager(){
Thread t1 = new Thread(new ProcessMessage());
t1.start();}
public class ProcessMessage implements Runnable{
public void run() {
String message;// TODO Auto-generated method stub
try{
while((message=reader.readLine()) != null){
// read line from buffer
System.out.println(message)"
HandleMessage(message);
}
} catch{}
}}
public void HandleMessage(String message){System.out.println(message);}
public void LoadGUI(){//load GUI, menubar, etc.
menuBarSubItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev){
AdditionalFunction d = new AdditionalFunction(reader,writer);
}
});}
}
到目前为止一切正常。现在在LoadGUI()中创建一个Jframe,加载并添加一个jmenubar,并添加一些菜单栏项。我为菜单栏项创建了一个actionlistener,用于加载另一个类(基本上,点击菜单栏项,新的jframe加载AdditionalFunction(读者,作者))
// AdditionalFunction.java
public class AdditionalFunction {
public AdditionalFunction(BufferedReader reader, PrintWriter writer){
ThreadManager();
}
public void ThreadManager(){
Thread t1 = new Thread(new ProcessDifferentMessage());
t1.start();
}
public class ProcessDifferentMessage implements Runnable{
public void run(){
String message;
try{
while((message=r.readLine()) != null){
System.out.println(message);
HandleDifferentMessage();
}
} catch(Exception ex){ex.printStackTrace();}
}
}
}
在这个新框架中,(称之为AdditionalFunction.java)我传递了我在Main类中创建的BufferedReader和writer。
然后我创建了一个threadmanager并尝试从新框架运行一个线程(称为ProcessDifferentMessage())(即AdditionalFunction.java,就像我在原始主应用程序中所做的那样)。
(所以此时我应该运行两个线程..一个专注于只读取ProcessMessage()和另一个ProcessDifferentMessage()。
ProcessMessage()触发正常(在打开AdditionalFunction.java之前)..但是在通过单击菜单栏项启动AdditionalFunction.java之后,当我尝试通过套接字发送消息时,它应该只触发ProcessDifferentMessage()..它不会发射,发射它再发射它,然后再发送它不会发射。
当我关闭第二个Jframe并且我发送应该触发ProcessDifferentMessage()的消息时,相同的行为有时不会触发。但是在这一点上,我不希望这个步骤甚至触发ProcessDifferenMessage(),因为我关闭了AdditionalFunction.java框架。
简而言之:我有一个主类,它创建一个线程,并为它提供一个可运行的incomingmessagereader。这个主类还有GUI,某些菜单项触发新的Jframe。 (即扩展JFrame的AdditionalFunction.java)。我将主类中创建的读/写器从主类传递给AdditionalFunction构造函数。从additionalFunction.java我创建一个新线程并给它另一个incomingmessagereader runnable(不同的实现和方法)。但我希望第二个incomingmessagereader可以在我关闭它的原始jframe时停止从套接字读取行(即,对于第二个incomingmessagereader可运行它将是additionalfunction.java)..但即使在我关闭第二个jframe之后......线程仍然是积极阅读信息。