我想问一下能对线程本身进行加锁吗?保证在这个线程没有结束之前只有这一个实例?即不允许其他任何地方启动这个线程?我在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一会让代码执行完哦,那等于没说.....

解决方案 »

  1.   


    看看java.util.concurrent.SynchronousQueue可以解决这个问题
      

  2.   

    run加synchronized没用=======================是同一个CountDown对象吗?应该是有用的
      

  3.   

    线程同步就是对线程加锁。
    即synchronize得用法。
      

  4.   

    class CountDown implements Runnable {
        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做锁,只可能有一个实例,故应该可以实现你的要求。形象一点说,
    张山,李四,王五 都是 人; 故张山以张山为锁,李四以李四为锁....;所以各自没有办法互斥。
    但是人这个对象是只有一个,所以都以它为锁,这个锁就是唯一的。