Использование синхронизированного подхода (в различных формах, размещенных здесь) совсем не помогает.
Такой подход помогает только убедиться, что один поток выполняет критическую секцию за раз, но это не то, что вам нужно. Вы должны предотвратить прерывание потока.
Блокировка чтения/записи помогает, но не имеет значения, поскольку ни один другой поток не пытается использовать блокировку записи.
Это только делает приложение немного медленнее, потому что JVM должна выполнять дополнительные проверки для выполнения синхронизированного раздела (используется только одним потоком, поэтому трата ЦП)
На самом деле, в том виде, в котором вы это делаете, поток не прерывается "на самом деле". Но похоже, что это так, потому что он должен уступать процессорное время другим потокам. Как работают потоки; ЦП дает каждому потоку возможность работать некоторое время в течение очень коротких промежутков времени. Даже когда работает один поток, этот поток уступает процессорному времени другим потокам других приложений (предполагая, что однопроцессорная машина упрощает обсуждение).
Это, вероятно, причина, по которой вам кажется, что поток время от времени приостанавливается/прерывается, потому что система позволяет каждому потоку в приложении работать некоторое время.
Итак, что вы можете сделать?
Чтобы увеличить восприятие отсутствия прерываний, вы можете назначить более высокий приоритет своему потоку и уменьшить его для остальных.
Если все потоки имеют одинаковый приоритет, возможное расписание потоков 1,2,3 может быть таким:
равномерно распределены
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3
При установке max для 1 и min для 2,3 это может быть так:
Больше ЦП для потока 1
1,1,1,2,1,1,3,1,1,1,2,1,1,1,3,1,2,1,1,1
Чтобы поток мог быть прерван другим потоком, он должен находиться в прерываемом состоянии, что достигается вызовом Object.wait, Thread.join или Thread.sleep.
Ниже приведен забавный код для экспериментов.
Код 1: Проверьте, как изменить приоритет потоков. Смотрите шаблоны на выходе.
public class Test {
public static void main( String [] args ) throws InterruptedException {
Thread one = new Thread(){
public void run(){
while ( true ) {
System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
}
}
};
Thread two = new Thread(){
public void run(){
while ( true ) {
System.out.println(".............................................");
}
}
};
Thread three = new Thread(){
public void run(){
while ( true ) {
System.out.println("------------------------------------------");
}
}
};
// Try uncommenting this one by one and see the difference.
//one.setPriority( Thread.MAX_PRIORITY );
//two.setPriority( Thread.MIN_PRIORITY );
//three.setPriority( Thread.MIN_PRIORITY );
one.start();
two.start();
three.start();
// The code below makes no difference
// because "one" is not interruptable
Thread.sleep( 10000 ); // This is the "main" thread, letting the others thread run for aprox 10 secs.
one.interrupt(); // Nice try though.
}
}
Код 2. Пример того, как поток может быть прерван (в данном случае во время сна)
public class X{
public static void main( String [] args ) throws InterruptedException {
Thread a = new Thread(){
public void run(){
int i = 1 ;
while ( true ){
if ( i++ % 100 == 0 ) try {
System.out.println("Sleeping...");
Thread.sleep(500);
} catch ( InterruptedException ie ) {
System.out.println( "I was interrpted from my sleep. We all shall die!! " );
System.exit(0);
}
System.out.print("E,");
}
}
};
a.start();
Thread.sleep( 3000 ); // Main thread letting run "a" for 3 secs.
a.interrupt(); // It will succeed only if the thread is in an interruptable state
}
}
person
OscarRyz
schedule
03.12.2008