2016-09-26 145 views
3

我想在另一个类中使用停止按钮来停止多个线程。我试图在停止线程中使用布尔函数,但它不起作用。当用户点击停止按钮时,线程仍在运行,我该如何解决这个问题?
线程不会停止使用按钮(多线程)


这是主类

public class ElevatorSystem extends javax.swing.JFrame { 
    public static int currentFloor = 1; 

    Thread ElevatorMove = null; 
    Thread PeopleMove = null; 
    static Thread RandomPeople = null; 
    Thread MAIN_THREAD = new Thread(new Main_Thread()); 
    private Main_Thread mt = new Main_Thread(); 
    ... 

    public ElevatorSystem() { 
     initComponents(); 
     randWeight(); 
     this.setResizable(false); 
     if(pplw.isEmpty()) 
      elev_weight = 0; 
     else{ 
      for(int s:pplw) 
       elev_weight += s; 

     } 
     RandomPeople = new Thread(new Randomize_People(EntryFloor1,EntryFloor2,EntryFloor3,EntryFloor4,EntryFloor5)); 
     RandomPeople.setPriority(Thread.MAX_PRIORITY-1); 
    //Start Adding peeoples 
     RandomPeople.start(); 
    } 

    ... 
    private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {           
     //not working... 
     if(MAIN_THREAD.isAlive()){ 
      try { 
       mt.stopThread(); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(ElevatorSystem.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }else{ 
      this.setEnabled(false); 
      JOptionPane.showMessageDialog(this,"Thread Not Running!","Thread Not Running!",JOptionPane.INFORMATION_MESSAGE); 
      this.setEnabled(true); 
     } 
    } 
} 

这是线程

class Main_Thread implements Runnable{ 
    .... 
    private final Object ElevatorSystem = new Object(); 
    private boolean pauseThreadFlag = false; 

    Main_Thread(){ 

    } 

    Main_Thread(
     JTextField EntryFloor1, JTextField ExitFloor1, 
     JTextField EntryFloor2, JTextField ExitFloor2, 
     JTextField EntryFloor3, JTextField ExitFloor3, 
     JTextField EntryFloor4, JTextField ExitFloor4, 
     JTextField EntryFloor5, JTextField ExitFloor5, 
     JTextField Ceiling, 

     JTextArea Elev1, JPanel Elev1Container, 

     String Elevator_Status, int currentFloor,int elev_weight, ArrayList pplw 
    ){ 
     this.EntryFloor1 = EntryFloor1; this.ExitFloor1 = ExitFloor1; 
     this.EntryFloor2 = EntryFloor2; this.ExitFloor2 = ExitFloor2; 
     this.EntryFloor3 = EntryFloor3; this.ExitFloor3 = ExitFloor3; 
     this.EntryFloor4 = EntryFloor4; this.ExitFloor4 = ExitFloor4; 
     this.EntryFloor5 = EntryFloor5; this.ExitFloor5 = ExitFloor5; 

     this.Elev1 = Elev1; 
     this.Elev1Container = Elev1Container; 

     this.Elevator_Status = Elevator_Status; 
     this.currentFloor = currentFloor; 

     this.elev_weight = elev_weight; 

     this.pplw.addAll(pplw); 
    } 
    @Override 
    public void run() { 
     System.out.println("Running..."); 
     System.out.println("Inside Weight: "+pplw); 
     while(true){ 
      checkForPaused(); 
      //whole process 
     } 
    } 

    private void checkForPaused() { 
     synchronized (ElevatorSystem) { 
      while (pauseThreadFlag) { 
       try { 
        ElevatorSystem.wait(); 
       } catch (Exception e) {} 
      } 
     } 
    } 

    public void stopThread() throws InterruptedException { 
     pauseThreadFlag = true; 
    } 
} 

class People_Move implements Runnable{ 
    ... 
} 

class Elevator_move_UP implements Runnable{ 
    ... 
} 

class Elevator_move_DOWN implements Runnable{ 
    ... 
} 

class Randomize_People implements Runnable{ 
    ... 
} 
+2

并阅读有关java命名约定。 Underbars只进入SOME_CONSTANT;但**没有**入类名。并且了解数组或列表 - 无论何时你开始命名变量a1,a2,...等等,你都在做**错误**。当然,变量名称会从lowerCase开始。违反这些规则会让任何Java程序员难以阅读您的代码! – GhostCat

回答

1

你有Main_Thread两个实例:

Thread MAIN_THREAD = new Thread(new Main_Thread()); 
private Main_Thread mt = new Main_Thread(); 

你停止之一,但观察其他。

if(MAIN_THREAD.isAlive()){ 
    try { 
    mt.stopThread(); 

只需使用一个实例:

private Main_Thread mt = new Main_Thread(); 
Thread MAIN_THREAD = new Thread(mt); 

你也应该确保在停止方法的更新paused在其他线程是可见的。您应该制定停止方法​​(或使用AtomicBoolean,或使用适当的线程间信号传递方式,如互斥量或信号量)。

0

我看到多种原因,为什么它不起作用。

  1. ElevatorSystem.mtMain_ThreadElevatorSystem.MAIN_THREAD使用的一个另一个实例。
  2. 我没有看到MAIN_THREAD在任何地方启动。
  3. Main_Thread预计它的标志pauseThreadFlagfalse停止,但Main_Thread.stopThread将其设置为true
  4. Main_Thread.checkForPaused来电wait,但我没有看到它被唤醒的地方。
  5. 我没有看到停止ElevatorSystem.MAIN_THREAD应该停止其他线程的原因。