Java 布尔值赢得';一丝不苟
我有一根线和一个荡秋千的工人。Swingworker从线程获取值并将其发布到JPanel中 由于我不希望线程在Swingworker获取该值之前继续,所以我在无限循环中停止它,但是当我更改布尔值时,线程不会继续 这是问题的一个例子: Swingworker类Java 布尔值赢得';一丝不苟,java,multithreading,swing,Java,Multithreading,Swing,我有一根线和一个荡秋千的工人。Swingworker从线程获取值并将其发布到JPanel中 由于我不希望线程在Swingworker获取该值之前继续,所以我在无限循环中停止它,但是当我更改布尔值时,线程不会继续 这是问题的一个例子: Swingworker类 public class Worker extends SwingWorker<Void,int> { Mail m; MyJPanel jp; public Worker(Mail m, MyJPa
public class Worker extends SwingWorker<Void,int>
{
Mail m;
MyJPanel jp;
public Worker(Mail m, MyJPanel jp)
{
this.m = m;
this.jp = jp;
}
protected Void doInBackground() throws Exception
{
int letter;
while(!m.getEnd())
{
letter = m.getMail();
publish(letter);
Thread.sleep(2000);
}
return null;
}
protected void process(List<int> chunks)
{
for (int number : chunks)
{
jp.setTextArea("Letter n " + number + " arrived");
}
}
}
public class Mail extends Thread
{
private int delivery;
private int num;
private boolean stop = true;
private boolean end = false;
public Mail(int num)
{
this.num = num;
}
public void run()
{
for(int i = 0; i < num;i++)
{
doDelivery(i);
}
end = true;
}
public void doDelivery(int x)
{
delivery = x;
System.out.println("Delivery awaits");
while(stop);
System.out.println("Delivery completed");
stop = true;
}
public int getMail()
{
System.out.println("Taking the mail");
stop = false;
return delivery;
}
public boolean getEnd()
{
return end;
}
控制台中的输出将是:
Delivery awaits
Taking the mail
//Span of 2 seconds
Taking the mail
Taking the mail
而在文本区域是
Letter n 0 arrived
Letter n 0 arrived
Letter n 0 arrived
我从来没有看到“交付完成”,所以即使Swingworker更改循环布尔值,线程也不会退出。为什么?我用信号量替换了bool值,现在邮件类看起来是这样的
public class Mail extends Thread
{
private int delivery;
private int num;
private Semaphore sem = new Semaphore(0,true);
private boolean end = false;
public Mail(int num)
{
this.num = num;
}
public void run()
{
for(int i = 0; i < num;i++)
{
doDelivery(i);
}
end = true;
}
public void doDelivery(int x)
{
delivery = x;
System.out.println("Delivery awaits");
try {
sem.acquire();
} catch (InterruptedException ex) {};
System.out.println("Delivery completed");
}
public int getMail()
{
System.out.println("Taking the mail");
sem.release();
return delivery;
}
public boolean getEnd()
{
return end;
}
公共类邮件扩展线程
{
私人递送;
私有整数;
私有信号量sem=新信号量(0,true);
私有布尔结束=false;
公共邮件(整数)
{
this.num=num;
}
公开募捐
{
for(int i=0;i
这似乎可行,但如果不行,我会更新。为了更快地获得更好的帮助,请发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。虽然MCVE很好,但只有第一段强烈指出所讨论的变量不是易变的。
public class Mail extends Thread
{
private int delivery;
private int num;
private Semaphore sem = new Semaphore(0,true);
private boolean end = false;
public Mail(int num)
{
this.num = num;
}
public void run()
{
for(int i = 0; i < num;i++)
{
doDelivery(i);
}
end = true;
}
public void doDelivery(int x)
{
delivery = x;
System.out.println("Delivery awaits");
try {
sem.acquire();
} catch (InterruptedException ex) {};
System.out.println("Delivery completed");
}
public int getMail()
{
System.out.println("Taking the mail");
sem.release();
return delivery;
}
public boolean getEnd()
{
return end;
}