2013-11-20 5 views
0

Я делал часы, которые показывают время в Java, я покажу код ниже:ошибка синхронизации Java

public class MyApp extends javax.swing.JFrame { 

     int timeRun = 0; 

    /** 
    * Creates new form MyApp 
    */ 
    public MyApp() { 
     initComponents(); 
       System.out.println("We'll start here!"); 

     new Thread() 
     { 
      public void Run(){ 

       while(timeRun == 0) 
       { 
        Calendar cal = new GregorianCalendar(); 

        int hour = cal.get(Calendar.HOUR); 
        int min = cal.get(Calendar.MINUTE); 
        int sec = cal.get(Calendar.SECOND); 
        int AM_PM = cal.get(Calendar.AM_PM); 

        String time = hour + ":" + min + ":" + sec; 
        System.out.print(time); 
        System.out.print("We'll end here!"); 

       } 
      } 

     }.start(); 

    } 

У меня есть JLabel, и другие компоненты, необходимые для этого JFrame работать.

У меня также есть основная настройка, хотя вы не можете увидеть ее в приведенном выше примере Моя проблема в том, что я не могу получить значение со времени, а также не могу напечатать «Мы закончим здесь» внутри Run, я новичок в Java, поэтому любая помощь будет высоко оценена.

Моя консоль печатает это:

run: 
We'll start here! 
BUILD SUCCESSFUL (total time: 6 seconds) 
+0

Если вам необходимо периодически обновлять пользовательский интерфейс, вы должны использовать 'javax.swing.Timer', который будет выполнять«тикает»в контексте Диспетчерский поток событий – MadProgrammer

+0

не уверен, что это связано или нет, но он должен быть запущен(), а не Run() – user3001267

+0

Не нужно кричать «РЕШЕНЫ» в заголовке. Это не дискуссионный форум. Это настоящий Q & A сайт. Вам просто нужно отметить ответ, принятый. Вопрос уже будет выглядеть по-разному в списках и поиске без необходимости изменения названия. – BalusC

ответ

4

Вы создали нить, но вы не переопределяется метод run - вместо того, чтобы вы создали метод Run. Java чувствительна к регистру. Изменить это:

public void Run() { 
    ... 
} 

к этому:

@Override 
public void run() { 
    ... 
} 

Использование @Override просит компилятор, чтобы подтвердить, что вы действительно являются перекрывая что-то - если бы вы использовали, что раньше, ты бы получил ошибка времени компиляции.

Кроме того, я рекомендую использовать Runnable и попутно, что в Thread конструктор вместо переопределения run в Thread сам по себе:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     ... 
    } 
}; 
new Thread(runnable).start(); 

Опять же, если бы вы реализовали интерфейс вместо создания анонимного подкласса Thread, компилятор подобрал бы проблему.

EDIT: Как отмечено в комментариях, ваша петля тоже бесконечна ... но вы увидите, что, когда она на самом деле доходит до бега.

+2

Собирался что-то добавить в аннотации '@ Override'; Рад видеть, как ты избил меня. :) –

+0

Не говоря уже о том, что 'timeRun' никогда не изменяется в оригинальной реализации OP (по крайней мере, в фрагменте, который мы видим), поэтому стоит упомянуть, даже когда' Run' изменен на 'run', Thread будет циклически работать. –

+0

@CraigOtis: Сделано. –

1

метод Нить ты должен переопределение является run. Потому что это тот, который вы наследует и который намерен фактически забегать какой поток должен делать.

Итак:

  1. Это все о наследовании.

  2. Добавить @Override аннотации в таких кодах. (IDE следовало бы предложить).

  3. Помните, что Java чувствительна к регистру.

  4. Придерживайтесь Примечание верблюда. В Java все должно быть закодировано в соответствии с ним.

    4.1 Классы и интерфейсы должны начинаться с заглавных букв.
    4.2 Атрибуты и методы должны начинаться с небольших букв.

Вы должны были сделать:

@Override 
public void run() { 

    //Your code here 
} 
+0

Я думаю, что у вас уже есть идея о том, что такое Thread, но если вы этого не сделаете, я предлагаю вам немного прочитать его для кодирования таких приложений;) – diegoaguilar

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