在线程中往往需要做一些阻塞,但是如果每次都是写一个循环,那不就很冗余,可以把睡眠的代码分离出来,如果停止睡眠就把sleep设置为false。
这样的设置其实是为了减少调用Thread.sleep的延误,比如说,你是Thread.sleep(30000),那么你在这30000毫秒的时间内,你是做不了事情的,但是如果你是new了MySleep的类,你就可以控制在这30000的时间内何时跳出睡眠。你可以把时间单位调低一点,就可以更加精准了。
public class MySleep {
private long sleepTime = 0;//要阻塞的时间
private long format = 100;//阻塞时间的单位,如果对具体时间没有精确的要求,可以将它设置到1000
private boolean sleep = true;
public MySleep(){};
public MySleep(long t){
sleepTime = t;
}
public void setSleepTime(long t){
sleepTime = t;
}
public void setSleepTime(long t,long f){
sleepTime = t;
format = f;
}
public boolean isSleep() {
return sleep;
}
public void setSleep(boolean sleep) {
this.sleep = sleep;
}
public void start(){
System.out.println("****** 阻塞开始 *****");
while(sleep){
if(sleepTime > 0){
try {
Thread.sleep(format);
} catch (InterruptedException e) {
e.printStackTrace();
}
sleepTime -= format;
}else{
sleep = false;
}
}
System.out.println("***** 阻塞完成 ******");
System.out.println("睡眠时间还有" + sleepTime);
}
}
public class TT {
private static myRunnable r1 = new myRunnable(3000);
private static myRunnable r2 = new myRunnable(10000);
private static myRunnable r3 = new myRunnable(5100);
public static void main(String[] args) {
Thread t1 = new Thread(r1);
t1.start();
Thread t2 = new Thread(r2);
t2.start();
Thread t3 = new Thread(r3);
t3.start();
Thread stopThread = new Thread(new Runnable() {
@Override
public void run() {
new MySleep(4000).start();
r1.setSleep(false);
r2.setSleep(false);
r3.setSleep(false);
}
});
stopThread.start();
}
}
class myRunnable implements Runnable{
MySleep mySleep;
public myRunnable(int sleepTime){
mySleep = new MySleep();
mySleep.setSleepTime(sleepTime, 100);
}
@Override
public void run() {
System.err.println(DateUtil.getNewDate(DateUtil.HMS1));
mySleep.start();
System.err.println(DateUtil.getNewDate(DateUtil.HMS1));
}
public void setSleep(boolean sleep){
mySleep.setSleep(sleep);
}
}