问题描述
我想问一下能对线程本身进行加锁吗?保证在这个线程没有结束之前只有这一个实例?即不允许其他任何地方启动这个线程?我在run前面加了synchronized,不过好像没什么用...我在弄一个计时器,不想阻塞主线程,所以另开这么一个线程计时器可以暂停,但是可能立即又继续了,所以如果只是设置一个标志位控制线程还有点不够,例如:classCountDownimplementsRunnable{publicvoidrun(){while(flag){System.out.println(pauseTime);try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}//这里还有一些代码要执行}}}
调用newThread(newCountDown()).start()启动了这个线程但是现在想要停止计时器,把flag设为false,可能下面的一些代码还没有执行完然后又要立即继续计时,又把flag设为true,再newThread(newCountDown()).start()那么此时就会有两个计时器了,显然不是想要的结果我想问一下这个时候怎么才能解决这个问题?可别告诉我在继续计时之前先sleep一会让代码执行完哦,那等于没说.....
解决方案
解决方案二:
看看java.util.concurrent.SynchronousQueue可以解决这个问题
解决方案三:
run加synchronized没用=======================是同一个CountDown对象吗?应该是有用的
解决方案四:
线程同步就是对线程加锁。即synchronize得用法。
解决方案五:
classCountDownimplementsRunnable{publicvoidrun(){synchronized(CountDown.class){while(flag){System.out.println(pauseTime);try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}//这里还有一些代码要执行}}}}
这样试试看,直接在run方法前面加synchronized,是以当前CountDown实例作为锁,而可以new多个CountDown实例,每个就是以自己做锁,所以根本没有办法实现你的要求。如果改成我上面写的代码,是以CountDown.class做锁,只可能有一个实例,故应该可以实现你的要求。形象一点说,张山,李四,王五都是人;故张山以张山为锁,李四以李四为锁....;所以各自没有办法互斥。但是人这个对象是只有一个,所以都以它为锁,这个锁就是唯一的。