java如何终止正在等待synchronized锁的线程

limchuenyu 发布于 2017/03/28 09:25
阅读 348
收藏 0

	public static void main(String[] args) throws InterruptedException, IOException {

		final Object synchronizedo = new Object();
		
                //先启动的线程
		new Thread(new Runnable() {

			@Override
			public void run() {
				synchronized (synchronizedo) {	//先启动的线程,占有synchronizedo
                                        //通过sleep模拟耗时较长的任务
					try {
						TimeUnit.SECONDS.sleep(Long.MAX_VALUE);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
		
                //确保上面的线程先运行
		TimeUnit.SECONDS.sleep(2L);

		final Thread t1 = new Thread(new Runnable() {

			@Override
			public void run() {
				Thread.currentThread().setName("t1");

				//线程执行到这里就阻塞了,并且该线程无法被终止	
				synchronized (synchronizedo) {
				}
			}
		});
		t1.start();
		

		TimeUnit.SECONDS.sleep(2L);
		
		t1.interrupt();
		t1.stop();
		
		TimeUnit.SECONDS.sleep(2L);
		
		System.out.println(t1.getState());


		TimeUnit.SECONDS.sleep(Long.MAX_VALUE);	//使main线程不会退出
	}

 

这段代码会输出"BLOCKED", 可见无论是interrupt还是stop都无法结束t1线程 现在的问题是,在t1没有获取synchronizedo对象锁的情况下,该如何结束t1线程? @国栋

加载中
0
国栋
国栋

据我所知,没有办法终止,这也是 synchronized 这种内部锁机制为人所诟病的一点。

如果想要用可中断的锁,可以考虑用外部锁, java.util.concurrent.Lock,用 Lock.lockInterruptibly(),你可以找些资料了解下。

另:@ 我好像没有什么用,我没有收到任何通知,我是偶然看到这里来的。

0
youcaihuacube
youcaihuacube

被中断的线程不能直接进入dead状态。不能依赖线程的方法,要自己用一些状态标识去检测。

0
开源中国-首席营养师

你干嘛不换一个锁的对象,非要用synchronizedo?

另外,你这个结构,有必要用同步锁么

返回顶部
顶部