有人可以向我解释为什么我的线程“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;
}
});
}
}
答案 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];
的可见性和原子性,但它不为数组内的值提供任何保证。
简而言之,如果go
将thread 2
修改为go[0]
,true
可能永远不会看到它......
如果thread 1
创建了一个新数组并将其分配给thread 2
,则go
会看到它......
在方法thread 1
中,您必须执行类似
actionPerformed()
另外我不明白保持数组的目的,在你的情况下你可以保留一个布尔标志(除非你打算存储多个标志)......
如果是这样,你可以使用bitset方法进行廉价并发,当你使用单个volatile int或long并在其中设置单个位时...这允许你使用单个volatile来获得32或64个标志的变化和可见性的原子性。 ..
答案 1 :(得分:-1)
尝试一起移除局部变量go[]
,始终从talking.stop();
中选择最新状态