无法在线程

时间:2017-06-01 04:35:49

标签: java multithreading

有人可以向我解释为什么我的线程“m”在按下注销jbutton时没有停止?程序似乎挂起或在一些无限循环中。在这种情况下,我无法理解线程发生了什么。

public class Log_GUI extends Jframe{
    private GUI talking;
    private volatile boolean[]go = new boolean[1]; 


                    go[0] = true;
                    setVisible(false);
                    GUI talking = new GUI(read_me,display_me,usr_name);
                    talking.create(go);


                    Thread m = new Thread(){
                      public void run(){

                          String me;
                          while (go[0]){

                              try
                              {


                                  try {
                                      me = (String) read_me.readObject();
                                      System.out.println(me);
                                      talking.sendme(me);

                                  }catch (ClassNotFoundException ClassNotfoundException){
                                  }
                              }catch (IOException IOException){
                              }
                          }
                      }

                    }; m.start();
                }

            } catch (ClassNotFoundException ClassNotFoundException) {

            }

    }catch (IOException IOException){

        }

        System.out.println("hello");
}
}



    public class GUI extends Jframe{

     public void create(boolean[]go){
       .........
         sign_out.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            go[0]=false;

        }
    });
    }
    }

2 个答案:

答案 0 :(得分:0)

您遇到并发问题。 function combinesheets() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var allsheets = ss.getSheets(); var combineSht = ss.getSheetByName("combinesheets"); for (var i=0; i<allsheets.length; i++) { if (shtName != 'combinesheets') { var shtName = allsheets[i].getName(); var sht = ss.getSheetByName(shtName); var shtrng = sht.getDataRange(); var shtrngA = shtrng.getValues(); for(var j=0;j<shtrngA.length;j++) { combineSht.appendRow(shtrngA[j]); } } } SpreadsheetApp.flush(); } 仅解决变量volatile boolean[]go = new boolean[1];的可见性和原子性,但它不为数组内的值提供任何保证。

简而言之,如果gothread 2修改为go[0]true可能永远不会看到它...... 如果thread 1创建了一个新数组并将其分配给thread 2,则go会看到它......

在方法thread 1中,您必须执行类似

的操作
actionPerformed()

另外我不明白保持数组的目的,在你的情况下你可以保留一个布尔标志(除非你打算存储多个标志)......

如果是这样,你可以使用bitset方法进行廉价并发,当你使用单个volatile int或long并在其中设置单个位时...这允许你使用单个volatile来获得32或64个标志的变化和可见性的原子性。 ..

答案 1 :(得分:-1)

尝试一起移除局部变量go[],始终从talking.stop();中选择最新状态