2015-07-29 3 views
-2

Я знаю снова и снова, люди спрашивают, как начать поток после того, как он был остановлен, и все говорят, что не можете. Это не дубликат, потому что я не нашел решения проблемы.Как я могу начать тему снова?

private void runInBackground() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (running) { 
       try { 
        checkPixel(); 
       } catch (AWTException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       try { 
        Thread.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 
} 

@Override 
public void nativeKeyPressed(NativeKeyEvent e) { 
    // TODO Auto-generated method stub 
    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode())); 
    if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F9")){ 
     stop(); 
    } 
    else if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F10")){ 

    } 

Так что в моем коде я слушаю глобальные ключевые события, используя JNativeHook. Я могу успешно остановить checkPixels() с помощью клавиши F9, но я не понимаю, что я должен делать, используя F10, когда я снова запустил checkPixel().

checkPixel() в основном проверяет изменение цвета пиксела

ОТВЕТИЛ Добавлен если заявление для моего состояния переменной running и сохранить время цикла верно позволяет мне включить/выключить метод, сохраняя при этом нити открытой. Спасибо Jaboyc

private void runInBackground() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       if(running){ 
        try { 
         checkPixel(); 
        } catch (AWTException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 
        try { 
         Thread.sleep(1); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }).start(); 
} 
+0

Я не совсем понимаю, что ваш код пытается сделать, но почему вы не можете просто вызвать 'runInBackground()' еще раз? – Ray

+1

Что делает метод 'stop()'? Вы должны изменить 'running' на true/false atomically –

+1

Возможный дубликат [Как приостановить, а затем возобновить поток?] (Http://stackoverflow.com/questions/16758346/how-pause-and-then-resume-a -thread) (Я знаю, что вы сказали, что это не дубликат, но на самом деле это так. Необходимые функции уже запрошены) –

ответ

2

Будет ли это работать

while (true) { 
    if (running) { 
     doStuff(); 
    } 
} 

в методе выполнения?

+0

Это то же самое, что 'while (running) doStuff()', который у него уже есть. Он не показывает нам, изменит ли он его ценность или нет. Я предлагаю удалить этот ответ, прежде чем downvotes придет –

+0

wow, это действительно работает, так как он поддерживает поток в любое время, большое вам спасибо. И вау второкурсник в старшей школе? впечатляющий, умнее моего старшего в колледже :) Я снова благодарю вас, очень аккуратное простое исправление –

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