#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';
}
Метод run
синхронизируется с самим TimerTask
. Синхронизированные методы экземпляра всегда всегда синхронизируются с этим объектом
. (Методы класса синхронизируются на объекте Class
.)
Если вы хотите выполнить синхронизацию на объекте, членом которого является foo
, вам необходимо квалифицировать это ключевое слово
. Предположим, что foo ()
является членом класса Bar
внутри метода run ()
из TimerTask
, вы можете использовать
public void run() {
synchronized(Bar.this) {
...
}
}
Существует только одна нить, которая может иметь доступ к элементам качания. Это 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
хм, этот код, который вы написали выше, говорит мне об этом. Вы сохранили часть кода дважды. Когда вы пишете синхронизированный метод, это означает, что только один поток может получить доступ к этому методу одновременно. Другие потоки ждут, пока синхронизированный метод разблокирован.
Я довольно уверен в этих ответах, но не могу найти хороший источник атм.
Первый вопрос:
синхронизация будет блокировать TimerTask.
Второй вопрос:
это относится к TimerTask; если бы вы хотели заблокировать содержащий объект, вы бы использовали MyContainedObject.this
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
}
}
}