【Java】ポタポタ-タイマーツール

1975 ワード

マルチスレッドプログラミングでは,リソースの有効利用とスレッド占有の問題を考慮する必要がある.
例えば、C-Sフレームワークでは、クライアント接続サーバの動作が行われる.クライアントがサーバに接続されている間、情報のやり取りを長時間行わずにサーバとの接続を維持すると、サーバの負担が増大するだけでなく、CPUリソースの浪費にもなります.したがって、クライアントが指定された時間内に動作しているかどうかを検出するタイマツールを完了し、そうでなければ抽象メソッドdoSomething()を呼び出してクライアントまたは関連スレッドを閉じたりバッファに置いたりするなどの操作を行い、CPUリソースをタイムリーに返却することができます.クライアントが情報インタラクションを必要とする場合、接続要求をサーバに再送信します.
コード実装では,ロックとタイマの誤差を考慮しなければならない.
指定した時間内にdoSomething()操作を起動するために使用される2つのスレッドを作成する必要があります.2番目のスレッドは、内部クラスによって実装され、最初のスレッドがnotify()を実行すると、スレッドを起動しdoSomething()メソッドを実行するブロックが作成されたばかりのトラフィック関数(タイマ時間外)を呼び出すスレッドとして機能する.
この2つのスレッドを実行する場合は、同じオブジェクトロックを使用し、スレッドのブロックと起動を臨界リソースとして他のスレッドのプリエンプトを回避する必要があります.
ソース:
package com.chy.timer.core;

public abstract class Didadida implements Runnable {
	private volatile boolean goon = false;
	private Object lock;
	private long delayTime;
	
	private static final long defaultTime = 1000;
	
	public Didadida() {
		this.lock = new Object();
	}
	
	public abstract void doSomething();
	
	public Didadida setDelayTime(long delayTime) {
		this.delayTime = delayTime;
		return this;
	}
	
	public void start() {
		if (goon == true) {
			return;
		}
		goon = true;
		
		new DidadidaWoker();
		new Thread(this, "Didadida").start();
	}
	
	@Override
	public void run() {
		if (delayTime == 0) {
			delayTime = defaultTime;
		}
		synchronized (lock) { 
			while (goon) {
				try {
					//              ;
					//                           ;
					//      notify()     ,        。
					lock.wait(delayTime);
					lock.notify();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public class DidadidaWoker implements Runnable{
		
		public DidadidaWoker() {
			new Thread(this).start();
		}
		
		@Override
		public void run() {
			while (goon) {
				synchronized (lock) {
					try {
						lock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				doSomething();
			}
		}
		
	}

}