анонимные классы Java и синхронизация и “это”

#include <stdio.h>
#define MAX_SIZE 100 // Maximum string size

/* Function declaration */
void trimTrailing(char * str);


int main()
{
    char str[MAX_SIZE];

    /* Input string from user */
    printf("Enter any string: ");
    gets(str);

    printf("\nString before trimming trailing white space: \n'%s'", str);

    trimTrailing(str);

    printf("\n\nString after trimming trailing white spaces: \n'%s'", str);

    return 0;
}

/**
 * Remove trailing white space characters from string
 */
void trimTrailing(char * str)
{
    int index, i;

    /* Set default index */
    index = -1;

    /* Find last index of non-white space character */
    i = 0;
    while(str[i] != '\0')
    {
        if(str[i] != ' ' && str[i] != '\t' && str[i] != '\n')
        {
            index= i;
        }

        i++;
    }

    /* Mark next character to last non-white space character as NULL */
    str[index + 1] = '\0';
}
11
задан jbu 30 April 2009 в 22:41
поделиться

4 ответа

Метод run синхронизируется с самим TimerTask . Синхронизированные методы экземпляра всегда всегда синхронизируются с этим объектом . (Методы класса синхронизируются на объекте Class .)

Если вы хотите выполнить синхронизацию на объекте, членом которого является foo , вам необходимо квалифицировать это ключевое слово . Предположим, что foo () является членом класса Bar внутри метода run () из TimerTask , вы можете использовать

public void run() {
  synchronized(Bar.this) {
    ...
  }
}
14
ответ дан 3 December 2019 в 07:14
поделиться

Существует только одна нить, которая может иметь доступ к элементам качания. Это AWT-EventQueue-0. Вы должны знать об этом. Если другие ваши потоки утопают или меняют элементы, очень вероятно, что GUI потерпит крах. Чтобы запустить ваш графический интерфейс с этим потоком:

  try {
            SwingUtilities.invokeAndWait(new Runnable(){
                public void run(){
                    Swing_Prozor1 prozor = new Swing_Prozor1();
                }
            });
        } catch (InterruptedException e) {
            //namjerno zanemareno
        } catch (InvocationTargetException e) {
            //namjerno zanemareno
        }

, и если у вас есть классы anonymus, это даст вам экземпляр класса, в котором вы находитесь, поэтому, если вы пишете в классе anonymus, это. это экземпляр этого класса. Чтобы получить экземпляр класса, который вы хотите написать:

ClassName.this

хм, этот код, который вы написали выше, говорит мне об этом. Вы сохранили часть кода дважды. Когда вы пишете синхронизированный метод, это означает, что только один поток может получить доступ к этому методу одновременно. Другие потоки ждут, пока синхронизированный метод разблокирован.

1
ответ дан 3 December 2019 в 07:14
поделиться

Я довольно уверен в этих ответах, но не могу найти хороший источник атм.

Первый вопрос:
синхронизация будет блокировать TimerTask.

Второй вопрос:
это относится к TimerTask; если бы вы хотели заблокировать содержащий объект, вы бы использовали MyContainedObject.this

2
ответ дан 3 December 2019 в 07:14
поделиться

If you are looking for synchronizing the foo() and run() then you may create an explicit lock object like

final Object lock = new Object();

and then synchronize on it.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
0
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: