我想问一下能对线程本身进行加锁吗?保证在这个线程没有结束之前只有这一个实例?即不允许其他任何地方启动这个线程?我在run前面加了synchronized,不过好像没什么用...我在弄一个计时器,不想阻塞主线程,所以另开这么一个线程计时器可以暂停,但是可能立即又继续了,所以如果只是设置一个标志位控制线程还有点不够,例如:
class CountDown implements Runnable {
public void run() {
while (flag) {
System.out.println(pauseTime) ;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//这里还有一些代码要执行
}
}
}
调用new Thread(new CountDown()).start()启动了这个线程但是现在想要停止计时器,把flag设为false,可能下面的一些代码还没有执行完然后又要立即继续计时,又把flag设为true,再new Thread(new CountDown()).start()那么此时就会有两个计时器了,显然不是想要的结果我想问一下这个时候怎么才能解决这个问题?可别告诉我在继续计时之前先sleep一会让代码执行完哦,那等于没说.....
class CountDown implements Runnable {
public void run() {
while (flag) {
System.out.println(pauseTime) ;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//这里还有一些代码要执行
}
}
}
调用new Thread(new CountDown()).start()启动了这个线程但是现在想要停止计时器,把flag设为false,可能下面的一些代码还没有执行完然后又要立即继续计时,又把flag设为true,再new Thread(new CountDown()).start()那么此时就会有两个计时器了,显然不是想要的结果我想问一下这个时候怎么才能解决这个问题?可别告诉我在继续计时之前先sleep一会让代码执行完哦,那等于没说.....
解决方案 »
- 求和为一个数的所有可能,比如5=1+1+1+1+1=2+3.....
- 请问Sun公司依靠什么赚钱的呢?
- java中两个线程如何判定一个线程是否已经执行
- applet stop()start()方法一直都不能自动调用,其他都是正常的,怎么回事? 我用的是IE6 SP2, appletviewer测试都是正常的,SOS!!
- 类定义中,关键字class前加static有什么意义?
- 哪位高手知道怎么样获得HTTP下载速度值?
- 怎样使用package
- 菜鸟问题--关于JAVA的例程TED
- JWindow 是不是不支持 KeyListener
- 关于package的一个问题!!
- JFrame 获取不到子容器?
- 用图表监控(类似股票的分时图)某个表的数据状态的疑问?
看看java.util.concurrent.SynchronousQueue可以解决这个问题
即synchronize得用法。
public void run() {
synchronized (CountDown.class) {
while (flag) {
System.out.println(pauseTime) ;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//这里还有一些代码要执行
}
}
}
}这样试试看,直接在 run方法前面加synchronized,是以当前CountDown 实例作为锁,而可以new 多个CountDown 实例,每个就是以自己做锁,所以根本没有办法实现你的要求。
如果改成我上面写的代码,是以CountDown.class做锁,只可能有一个实例,故应该可以实现你的要求。形象一点说,
张山,李四,王五 都是 人; 故张山以张山为锁,李四以李四为锁....;所以各自没有办法互斥。
但是人这个对象是只有一个,所以都以它为锁,这个锁就是唯一的。