关于线程中的拥塞
关于线程中的阻塞
在线程中往往需要做一些阻塞,但是如果每次都是写一个循环,那不就很冗余,可以把睡眠的代码分离出来,如果停止睡眠就把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); } }