2013-11-13 1 views
0

У меня есть такой код в моем приложении, которое я хочу работать в фоновом режиме:класс наследуется от Thread делает CPU пробег 100%

import java.awt.*; 
import java.awt.datatransfer.*; 

class Main extends Thread implements ClipboardOwner { 

    private Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard(); 

    public void run() { 
     Transferable trans = sysClip.getContents(this); 
     regainOwnership(trans); 
     System.out.println("Listening to board..."); 
     while (true) { } 
    } 

    public static void main(String[] args) { 
     Main b = new Main(); 
     b.start(); 
    } 
    //............ 

Он слушает Ctrl+C и печатает содержимое буфера обмена, как только эта комбинация клавиш нажат. Тем не менее, он все время работает на 99%. Если я удалю while (true) { }, приложение просто остановится через секунду.

Я попытался запустить его как java -jar myapp.jar &, но результат был тот же. И это было бы так же на Windows, я думаю, хотя сейчас я забочусь о Linux.

Что мне делать?

+0

Попробуйте добавить Thread.sleep () внутри цикла. –

+0

не удлините нить. лучше всего реализовать runnable –

+0

@PhilippSander, почему? –

ответ

3

У вас есть поток с бесконечным циклом. Это то, что будет использовать 100% вашего процессора. Если ничего другого, добавление второй пары Thread.sleep() в цикл приведет к снижению использования ЦП.

+0

максимальное время может спать 0,5 сек. Имеет ли смысл использовать Thread.sleep? –

+0

@Alex да. Полсекунды - огромное время для процессора. –

+0

@Alex Вы должны иметь возможность передать любой произвольный длинный аргумент в ['Thread.sleep'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep (длинный)). –

0

Вам следует избегать использования вечных циклов, чтобы проверить, изменилась ли переменная, а скорее использовать прослушиватель. Точнее, FlavorListener позволит вам выполнить код при изменении буфера обмена.

Было бы что-то вроде этого:

Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(
     new FlavorListener() { 
     @Override 
     public void flavorsChanged(FlavorEvent e) { 
      System.out.println("Clipboard contents: " + e.toString()); 
     } 
    }); 
+0

Я уже видел этот код, и он не работал. Не могли бы вы привести полный рабочий пример? –

+0

У меня нет, но у этих парней есть несколько указателей: http://www.coderanch.com/t/377833/java/java/listen-clipboard – Luke

+0

и где там FlavorListener? –

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