【问题标题】:How can execute multiple object in threadpool executor?如何在线程池执行器中执行多个对象?
【发布时间】:2015-10-23 08:52:31
【问题描述】:
public final class ServiceThread implements Runnable,ISoapResultProcess {
private SOAPServiceManager soapservice;
private  ServiceSync obj=new ServiceSync();
private Context mContext;
int value;
private SyncUtils util;
private ISoapResultProcess consumer;
private boolean flag=true;
private ThreadPoolExecutor mExecutor;
private boolean boollock=true;
private Object objnew=new Object();
public ServiceThread(ServiceSync a,Context context) {
    this.obj=a;
    util = SyncUtils.getInstance(context); 
    this.mContext=context;
    consumer=this;
    if (soapservice == null) {
        soapservice = new SOAPServiceManager(context);
    }
}

    public void run() {
        // Do sending server update request here
        if (soapservice.haveNetworkConnection()) {      
            int op = obj.getOpconst();
             Log.e("val", ""+op);
             String strType=obj.getOptype();
             Log.e("strType", ""+strType);
            boolean boolflag=obj.getOpflag();
            if(strType.contentEquals("upload"))
            {
                util.syncProcess(op, boolflag,consumer);
            }else
            {
                util.downloadsyncProcess(op, boolflag,consumer);
            }
            flag=util.getOpflag();
            synchronized (objnew) {

                    try {
                        objnew.wait();

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                Log.e("runflag0", "-"+flag);
                /*if(flag)
                {
                    flag = false;
                    run();
                    return;
                }*/


                return;
            }

        }
    }
    @Override
    public void processResponse(JSONObject result, String method) {
        // TODO Auto-generated method stub
        boollock=java.lang.Thread.holdsLock(objnew);
        if(boollock)
        {
            objnew.notify();
        }
        mExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());

        ServiceThreadlocal tempThreadServiceThread = new ServiceThreadlocal(1,method,true, mContext,result,consumer);
        mExecutor.execute(tempThreadServiceThread);
    }
}

上述程序线程池执行器每次收到不同的对象值时执行。在本例中,我发送了 obj1,obj2。如果 obj1 执行到那个时候 obj2 将处于等待阶段。该对象释放下一个对象将被执行。但我的程序第一个对象只执行。注意:执行的第一个对象获得响应,然后要执行另一个对象

【问题讨论】:

  • 为什么对象要等待?它是一个多线程范例
  • 第一个对象发送到服务器的请求,接收响应然后只执行另一个对象。那是场景
  • 为什么两个对象不能一起上服务器?如果它是一个请求依赖于先前操作的响应的请求响应机制,是否不需要并行处理?
  • 你想要做的是让一个同步线程执行..一个线程在另一个线程结束时执行。对吗?
  • threadpoolexecutor 是用 LinkedBlockingQueue 实例化的。只需将新的 runnable 添加到同一执行程序的该队列中,它应该可以工作。 (目前看来你每次都创建一个新的 thredpoolexecutor 和一个新的linkedblockingqueue)

标签: java android multithreading threadpoolexecutor


【解决方案1】:
public ServiceThread(ServiceSync a,Context context) {
  mExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>());
  this.obj=a;
  util = SyncUtils.getInstance(context); 
  this.mContext=context;
   consumer=this;
  if (soapservice == null) {
    soapservice = new SOAPServiceManager(context);
  }
}

 //...

@Override
public void processResponse(JSONObject result, String method) {
    // TODO Auto-generated method stub
    boollock=java.lang.Thread.holdsLock(objnew);
    if(boollock)
    {
        objnew.notify();
    }

    ServiceThreadlocal tempThreadServiceThread = new    ServiceThreadlocal(1,method,true, mContext,result,consumer);
    mExecutor.submit(tempThreadServiceThread);
}

【讨论】:

  • 以同样的方式应用,但没有奏效。仅执行第一个方法
猜你喜欢
  • 2018-12-11
  • 2017-06-28
  • 2014-08-27
  • 2017-12-29
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多