`

关于线程中的阻塞

 
阅读更多

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics