异步线程处理

线程中使用 java.lang.Runnable

如果用户在代码中通过 java.lang.Runnable 新启动了线程或者采用了线程池去异步地处理一些业务,那么需要将 SOFATracer 日志上下文从父线程传递到子线程中去,SOFATracer 提供的 com.alipay.common.tracer.core.async.SofaTracerRunnable 默认完成了此操作,大家可以按照如下的方式使用:

  1. Thread thread = new Thread(new SofaTracerRunnable(new Runnable() {
  2. @Override
  3. public void run() {
  4. //do something your business code
  5. }
  6. }));
  7. thread.start();

线程中使用 java.util.concurrent.Callable

如果用户在代码中通过 java.util.concurrent.Callable 新启动线程或者采用了线程池去异步地处理一些业务,那么需要将 SOFATracer 日志上下文从父线程传递到子线程中去,SOFATracer 提供的 com.alipay.common.tracer.core.async.SofaTracerCallable 默认完成了此操作,大家可以按照如下的方式使用:

  1. ExecutorService executor = Executors.newCachedThreadPool();
  2. SofaTracerCallable<Object> sofaTracerSpanSofaTracerCallable = new SofaTracerCallable<Object>(new Callable<Object>() {
  3. @Override
  4. public Object call() throws Exception {
  5. return new Object();
  6. }
  7. });
  8. Future<Object> futureResult = executor.submit(sofaTracerSpanSofaTracerCallable);
  9. //do something in current thread
  10. Thread.sleep(1000);
  11. //another thread execute success and get result
  12. Object objectReturn = futureResult.get();

这个实例中,假设 java.util.concurrent.Callable 返回结果的对象类型是 java.lang.Object,实际使用时可以根据情况替换为期望的类型。