```python
import uuid
from collections import deque
from typing import Dict, Optional
from threading import Lock

class JobQueue:
    def __init__(self):
        self._queue: deque = deque()
        self._results: Dict[str, dict] = {}
        self._lock = Lock()
    
    def add_job(self, job_id: str, data: dict) -> str:
        with self._lock:
            self._queue.append({"job_id": job_id, "data": data})
            return job_id
    
    def get_result(self, job_id: str) -> Optional[dict]:
        with self._lock:
            return self._results.get(job_id)
    
    def process_jobs(self, processor=None):
        with self._lock:
            while self._queue:
                job = self._queue.popleft()
                job_id = job["job_id"]
                data = job["data"]
                
                if processor:
                    result = processor(data)
                    self._results[job_id] = result
                else:
                    self._results[job_id] = {"status": "completed", "job_id": job_id}
    
    def clear(self):
        with self._lock:
            self._queue.clear()
            self._results.clear()
```