使用同步方法(在此处发布的各种形式)根本没有帮助。
这种方法仅有助于确保一个线程一次执行关键部分,但这不是您想要的。您需要防止线程被中断。
读/写锁似乎有帮助,但没有任何区别,因为没有其他线程正在尝试使用写锁。
它只会使应用程序变慢一点,因为 JVM 必须执行额外的验证来执行同步部分(仅由一个线程使用,因此浪费 CPU)
实际上,按照您的方式,线程并没有“真正”被中断。但它似乎确实如此,因为它必须为其他线程提供 CPU 时间。线程的工作方式是;CPU 让每个线程有机会在很短的时间内运行一段时间。即使是在单个线程运行时,该线程也会与其他应用程序的其他线程产生 CPU 时间(假设单处理器机器以保持讨论简单)。
这可能是您认为线程不时暂停/中断的原因,因为系统让应用程序中的每个线程运行一段时间。
所以,你可以做什么?
为了增加没有中断的感觉,您可以做的一件事是为您的线程分配更高的优先级,并在其余部分降低它。
如果所有线程具有相同的优先级,则线程 1、2、3 的一个可能调度可能是这样的:
平均分配
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3
虽然将最大值设置为 1,将最小值设置为 2,3,但它可能是这样的:
更多 CPU 到线程 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
}
}