能对线程本身加锁吗?

问题描述

我想问一下能对线程本身进行加锁吗?保证在这个线程没有结束之前只有这一个实例?即不允许其他任何地方启动这个线程?我在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做锁,只可能有一个实例,故应该可以实现你的要求。形象一点说,张山,李四,王五都是人;故张山以张山为锁,李四以李四为锁....;所以各自没有办法互斥。但是人这个对象是只有一个,所以都以它为锁,这个锁就是唯一的。

时间: 2024-09-20 06:37:36

能对线程本身加锁吗?的相关文章

.Net线程问题解答

转自 http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论 目录   基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程WinForm程序老是抛出InvalidOperationE

java 线程关闭小结(转)

  首先,要说的是java中没有一种停止线程的方法是绝对安全的.线程的中断Thread.interrput()方法很容易给人一种误会,让人感觉是一个线程使另外一个正在运行的线程停止工作,但实际上interrput仅仅传递了请求中断的信息.线程自己会在下一个方便的时间中断.某些操作会接受这个请求时发出一个异常,比如wait,sleep.每一个Thread线程都有一个中断状态,是boolean型的当调用interrput方法后会使中断为true.当使用的静态的interrputed时可以清除中断状态

在Linux中使用线程

我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下.如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级. 首先说明一下,在Linux编写多线程程序需要包含头文件pthread.h.也就是说你在任何采用多线程设计的程序中都会看到类似这样的代码: #include 当然,进包含一个头文件是不能搞定线程的,还需要连接libpthread.so这个库,因此在程序连接阶段应该有类似这样的指令: gcc program.o -o program -lpthread.h>

Java线程

一.创建线程的两种方式 1. 继承Thread类 类 1) 定义子类继承Thread类. 2) 子类中重写Thread类中的run方法. 3) 创建Thread子类对象,即创建了线程对象. 4) 调用线程对象start方法:启动线程,调用run方法. 2. 实现Runnable 接口 1)定义子类,实现Runnable接口. 2)子类中重写Runnable接口中的run方法. 3)通过Thread类含参构造器创建线程对象. 4)将Runnable接口的子类对象作为实际参数传递给Thread类的构

[转载].Net线程问题解答

目录   基础篇 怎样创建一个线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决? Invoke,BeginInvoke干什么用的,内部是怎么实现的 每个线程都有消息队列吗? 为什么Winform不允许跨线程修改UI线程控件的值 有没有什么办法可以简化WinForm多线程的开发 线程池 线程池的作用是什么? 所有进程使用一个共享的线程池,

一起谈.NET技术,.Net线程问题解答

基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决? Invoke,BeginInvoke干什么用的,内部是怎么实现的 每个线程都有消息队列吗? 为什么Winform不允许跨线程修改UI线程控件的值 有没有什么办法可以简化WinForm多线程的开发 线程池 线程池

[转载]Linux 线程实现机制分析

  自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的.   一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位.在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开

java concurrent包自带线程池和队列详细讲解

Java线程池使用说明一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助.二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资

如何中断JAVA线程

如何中断JAVA线程 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.       在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程.                                                                                      背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,