public synchronized void execute(Runnable r) {
    	if(!(r instanceof HdAsyncTaskFuture)){
    		return;
    	}
    	BdAsyncTaskRunnable runnable = new BdAsyncTaskRunnable((HdAsyncTaskFuture<?>)r) {
            public void run() {
                try {
                	try{
                    	if(getPriority() == HdAsyncTaskPriority.HIGH){
                    		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DEFAULT - 1);
                    	}else if(getPriority() == HdAsyncTaskPriority.MIDDLE){
                    		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_DEFAULT);
                    	}else{
                    		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
                    	}
                	}catch(Exception ex){
                        ex.printStackTrace();
                	}
                	runTask();
                } finally {
                	if(isSelfExecute() == false){
                		mHandler.sendMessageDelayed(mHandler.obtainMessage(TASK_RUN_NEXT_ID, this), 1);
                	}
                }
            }
        };
        if(runnable.isSelfExecute() == true){
        	new Thread(runnable).start();
        	return;
        }
        
        int num = mTasks.size();
        int index = 0;
        for (index = 0; index < num; index++) {
			if(mTasks.get(index).getPriority() < runnable.getPriority()){
				break;
			}
		}
        mTasks.add(index, runnable);
        scheduleNext(null);
    }