Java 布尔值赢得';一丝不苟

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

我有一根线和一个荡秋千的工人。Swingworker从线程获取值并将其发布到JPanel中

由于我不希望线程在Swingworker获取该值之前继续,所以我在无限循环中停止它,但是当我更改布尔值时,线程不会继续

这是问题的一个例子:

Swingworker类

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;
}