Android服务和工作线程ReentrantLock无限循环

时间:2016-09-21 17:50:04

标签: android multithreading service java-native-interface reentrantlock

您好我想摆脱在服务中保存工作线程的无限循环。

我尝试使用ReentrantLock()方法,但似乎无法让它工作。

我的工作线程从JNI调用nativeWaitForTask方法并进入休眠状态。

但我的服务主线程似乎无法在submitTask方法中唤醒他,他应该在工作线程中发出信号。

就像await()调用阻止了服务的主线程一样。

但就我所知,他们处于不同的主题......

我做错了什么?为什么不起作用?

    private synchronized void nativeWaitForTask() {

    threadLock.lock();

    try {


        while(opcode == SR_Manager.STATE_IDLE) {

            newTask.await();
        }

    }catch (InterruptedException e) {

        e.printStackTrace();
        Log.e(SR_Manager.DEBUG_TAG,"Failed to wait for new task! " + e.toString());

    }finally {

        threadLock.unlock();
    }
}


    private synchronized void submitTask() {

    if (nativeMain.isAlive()) {

        dstImageName = sr.getDstImageName();

        if (sr.getSrcImagePath() != null && !sr.getSrcImagePath().equals(srcImagePath)) {

            srcImagePath = sr.getSrcImagePath();
            width = sr.getWidth();
            height = sr.getHeight();
            format = sr.getFormat();
            algorithm = sr.getAlgorithm();
            value = sr.getValue();
            saveOutput = sr.getSaveOutput();
            opcode = SR_Manager.STATE_LOAD_IMAGE;

        } else if (sr.getOpcode() != SR_Manager.STATE_LOAD_IMAGE) {

            algorithm = sr.getAlgorithm();
            value = sr.getValue();
            saveOutput = sr.getSaveOutput();
            opcode = sr.getOpcode();
        }

        t0 = System.currentTimeMillis();

    } else {

        // No native thread no service...
        silentCrash(-100);
    }

    // Wake the worker thread which waits for the new task condition
    threadLock.lock();
    newTask.signal();
    threadLock.unlock();
}

1 个答案:

答案 0 :(得分:0)

错误是对方法使用synchronized关键字。它给一个带锁对象的工作线程一个双锁,另一个带有服务实例(this)对象,并阻止了服务的主线程。

现在可以很好地工作,并且当工作线程等待任务时,将CPU使用率从无限循环的常量12%降低到0%。