Использование синхронизированного подхода (в различных формах, размещенных здесь) совсем не помогает.
Этот подход только помогает убедиться, что один поток выполняет критическую секцию одновременно , но это не то, что вам нужно. Вы должны предотвратить прерывание потока.
Блокировка чтения / записи, похоже, помогает, но не имеет значения, поскольку никакой другой поток не пытается использовать блокировку записи.
Это только делает приложение немного медленнее, потому что JVM должна выполнить дополнительные проверки для выполнения синхронизированного раздела (используется только одним потоком, таким образом, тратит впустую CPU)
На самом деле, как у вас, поток не прерывается " на самом деле ". Но похоже, что так и есть, потому что он должен уступать процессорное время другим потокам. Способ работы потоков таков; ЦП дает каждому потоку возможность немного поработать в течение очень коротких периодов времени. Даже один, когда работает один поток, этот поток отдает процессорное время другим потокам других приложений (предполагая, что обсуждение на одном процессоре будет простым).
Это, вероятно, причина, по которой вам кажется, что поток время от времени приостанавливается / прерывается, потому что система позволяет некоторым потокам в приложении работать некоторое время.
Итак, что вы можете сделать?
Чтобы повысить восприятие отсутствия прерываний, вы можете назначить более высокий приоритет вашему потоку и уменьшить его для остальных.
Если все потоки имеют одинаковый приоритет, один из возможных расписаний потоков 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
}
}