2015-10-28 5 views
0

Я новичок в Java и действительно не могу понять, как работают некоторые функции, такие как прерывание. Я читал javadocs и предыдущие ответы здесь, поэтому я предполагаю, что я должен ввести код во время (! Прерывания) цикла, и если он получит прерванный статус, он должен закрыть. У меня есть две кнопки - запуск и остановка и поток в другом классе. Цель темы - читать штрих-коды - все работает нормально, я получаю правильные сообщения об ошибках во всех исключениях, но Thread.currentThread(). Interrupt(); никогда не работает. То же самое для t.interrupt() - t является экземпляром класса потоков. Что я делаю не так?Почему нить в моем коде не прерывается?

Кнопка:

Thread t = new Serverside(); 
//start server button 
btnStartServer.addActionListener(event -> 
{ 
btnStartServer.setEnabled(false); 
btnStopServer.setEnabled(true); 
connectButtonPressed = true; 
try { 
t.start(); 
} 
catch (IllegalThreadStateException e) 
{ 
t.interrupt(); 
JOptionPane.showMessageDialog(contentPane, "Error, thread already running."); 
} 
}); 
//Stop server button 
btnStopServer.addActionListener(event -> 
{ 
t.interrupt(); 
statusMsg.setText("trying to close connection"); 
}); 

класс с резьбой:

class Serverside extends Thread 
{ 
public void run() 
{ 
    try { 
    while(!Serverside.currentThread().interrupted()) 
    { 

      try { 
       server = new ServerSocket(Main.sock); 
      } catch (IOException e) { 
       JOptionPane.showMessageDialog(null, "Порт занят: " + Main.sock); 
       // 
       Serverside.currentThread().interrupt(); 
      } 
      try { 
       if (connectButtonPressed) { 
        Main.statusMsg.setText("ожидание подключения на порт " + Main.sock); 
        Main.client = server.accept(); 
        Main.btnGetPhoto.setEnabled(true); 
        Main.isconnected = true; 
        Main.statusMsg.setText("соединение установлено"); 
        //очистка экрана терминала 
        //Main.client.getOutputStream().write("\u001B[2J".getBytes()); 
        //Main.client.getOutputStream().flush(); 
       } 
       else 
       { 
        JOptionPane.showMessageDialog(null, "Не нажата кнопка connect"); 
        // 
        Thread.currentThread().interrupt(); 
       } 
       if (!Main.isconnected) 
       { 
        JOptionPane.showMessageDialog(null, "Нет соединения с клиентом"); 
        // 
        Thread.currentThread().interrupt(); 
       } 
       while (Main.isconnected) { 
        BufferedReader br = new BufferedReader(new InputStreamReader(Main.client.getInputStream())); 
        Main.line = br.readLine(); 
        if (!Serverside.currentThread().interrupted()) 
       { 
        if (Main.line != null) { 
         try { 
          //Заменить строку ниже на динамически выбираемое имя файла 
          Main.myPicture = ImageIO.read(new File("P:/LM935230105CN.jpg")); 
          BufferedImage thumbnail = new BufferedImage(612, 512, BufferedImage.TYPE_INT_RGB); 
          Graphics2D g = thumbnail.createGraphics(); 
          g.drawImage(Main.myPicture, 0, 0, 612, 512, null); 
          g.dispose(); 
          Main.myIcon = new ImageIcon(thumbnail); 
          Main.picLabel.setIcon(Main.myIcon); 
         } catch (IOException ex) { 
          ex.printStackTrace(); 
          JOptionPane.showMessageDialog(null, "Файл не найден!"); 
         } 
         //Распознавание штрих-кода 
         Pattern pattern = Pattern.compile("[A-Za-z]{2}[0-9]{9}[A-Za-z]{2}"); 
         Matcher matcher = pattern.matcher(Main.line); 
         if (matcher.find()) { 
          Main.barCodeMsg.setText(matcher.group()); 
          Main.barCodeString = (matcher.group()); 
          Main.barCodeStringArray = Main.barCodeString.split(""); 
          final int[] ints = new int[9]; 

          for (int i = 0; i < 9; i++) { 
           try { 
            ints[i] = Integer.parseInt(Main.barCodeStringArray[i + 2]); 
           } catch (NumberFormatException e) { 
            e.printStackTrace(); 
           } 
          } 
//код проверки контрольной суммы 
          int checksum = ints[8]; 
          int temp; 
          temp = 11 - (ints[0] * 8 + ints[1] * 6 + ints[2] * 4 + ints[3] * 2 + ints[4] * 3 + ints[5] * 5 + ints[6] * 9 + ints[7] * 7) % 11; 
          if (temp == 10) { 
           temp = 0; 
          } 
          if (temp == 11) { 
           temp = 5; 
          } 
          if (temp == checksum) { 
           Main.statusMsg.setText("штрих-код обнаружен, контрольная сумма совпадает"); 
          } else { 
           Main.statusMsg.setText("<html><font color='red'>штрих-код обнаружен, контрольная сумма не совпадает</font></html>"); 
          } 
         } else { 
          //Строка принята, но штрих-код не распознан 
          Main.statusMsg.setText("данные не содержат штрих-кода"); 
          barCodeString = ""; 
         } 
        } 
        else { 
         //Строка не содержит данных 
         Main.picLabel.setIcon(null); 
        } 
       } 
        else { 
         //blah-blah-blah 
         JOptionPane.showMessageDialog(null, "Поток прерван."); 
         break; 
        } 
       } 
      } catch (IOException e) { 
       // 
       Serverside.currentThread().interrupt(); 
       JOptionPane.showMessageDialog(null, "Ошибка соединения."); 
       e.printStackTrace(); 
      } catch (NullPointerException e1) { 
       JOptionPane.showMessageDialog(null, "Ошибка открытия порта"); 
       // 
       Serverside.currentThread().interrupt(); 
       e1.printStackTrace(); 
      } 
     } 

    } 
    finally 
    { 
     try 
     { 
      server.close(); 
      JOptionPane.showMessageDialog(null, "Порт" + sock + " закрыт"); 
     } 
     catch (IOException e) 
     { 
      JOptionPane.showMessageDialog(null, "Ошибка закрытия порта"); 
      e.printStackTrace(); 
      // 
      Serverside.currentThread().interrupt(); 
     } 
    } 
} 
} 

ответ

0

Я думаю, что это может быть точка:

while (Main.isconnected) { 

В внутри вы проверить прерванное состояние, но вы не оставляйте цикл while, если это так. Попробуйте добавить еще одну проверку здесь.

while (Main.isconnected && !Serverside.currentThread().interrupted() { 

Также обратите внимание:

Прерванное состояние резьбы очищается с помощью этого метода.

Так что я думаю, вы должны использовать isInterrupted() вместо interrupted().

В качестве побочного элемента вы также можете немного «очистить» код, введя методы, называемые вместо одного метода long run(). Это помогает сохранить обзор и отладить недостатки в частях кода. Но если это нормально, как есть, сначала «запустите его» ... :)

Смежные вопросы