JAva stopメソッドはなぜ使えないのですか?
一方、stopスレッドは非常に乱暴であり、finallyコードブロックを実行したりsynchronizedを解放したりしない限り、スレッドは直接終了され、非常に乱暴である.また、スレッドがJUCの反発ロックを持っている場合、ロックが解放されず、他のスレッドが永遠に待つことになる可能性がある.
JUCはLockが自動的に解放されるのではなく、自発的に解放され、finallyコードブロックから解放される必要があります.実際にはstopのスレッドはfinallyコードブロックをスキップしませんが、tryコードブロックを実行していないとstopされ、finallyコードブロックは実行されません.これは「ロック」が永遠に解放されず、他のスレッドはロックを取得できないという気まずい状況になります.
テストコード:
長い間、コンソールの出力は次のようになりました.
2020/07/07 22:44:37 thread1 start 2020/07/07 22:44:40 stop thread1 2020/07/07 22:44:40 thread2 start
JUCはLockが自動的に解放されるのではなく、自発的に解放され、finallyコードブロックから解放される必要があります.実際にはstopのスレッドはfinallyコードブロックをスキップしませんが、tryコードブロックを実行していないとstopされ、finallyコードブロックは実行されません.これは「ロック」が永遠に解放されず、他のスレッドはロックを取得できないという気まずい状況になります.
テストコード:
public class TestStopLockThread {
private static Lock lock = new ReentrantLock();
public static void main(String[] args) throws Exception {
Thread thread1 = new MyThread();
thread1.setName("thread1");
thread1.start();
sleep(3);
Thread thread2 = new MyThread();
thread2.setName("thread2");
thread2.start();
//
System.out.println(nowTime() + " stop thread1");
thread1.stop();
//
thread1.join();
thread2.join();
}
private static class MyThread extends Thread{
@Override
public void run() {
fun1();
}
}
private static void fun1(){
System.out.println(nowTime() + Thread.currentThread().getName() + " start");
lock.lock();
// stop ,
sleep(10);
try {
sleep(30);
System.out.println(nowTime() + Thread.currentThread().getName() + " end");
}finally {
System.out.println(nowTime() + Thread.currentThread().getName() + " finally ");
lock.unlock();
}
}
}
長い間、コンソールの出力は次のようになりました.
2020/07/07 22:44:37 thread1 start 2020/07/07 22:44:40 stop thread1 2020/07/07 22:44:40 thread2 start