同步锁和单独的线程:Android

时间:2013-04-10 12:21:18

标签: java android multithreading synchronized

我有一个回调函数,我收到一个字符串。 由于处理需要时间,因此将该字符串传递给单独的线程进行处理。 此外,由于可以同时进行多个回调,我希望有一个同步锁,直到我将字符串传递给新线程。但是我也不希望锁定新线程(处理正在进行中)。

有人可以帮我弄清楚这个设计吗?

我已经写了下面的代码但是在这里我认为在这里没有回调可以接收,直到单独线程的整个处理也完成,从而打败了这个新线程的整个目的。

String sLine;
onClick(String line){
synchronized (lock) {
                sLine = line;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    doProcessing(Sline);    

                }).start(); 
}
}

2 个答案:

答案 0 :(得分:1)

  

此外,由于可以同时进行多个回调,我希望有一个同步锁,直到我将字符串传递给新线程。

答:我认为你不需要锁定。多线程无法访问此字符串。

  

但是我不希望锁定新的线程(处理正在进行中)。

答:我发现此处没有任何内容被锁定:)我认为如果您这样做会更好:

  • 创建一个类Runner实现Runnable,这个类将进行处理
  • 每次有回调时,使用ThreadPoolExecutor执行此Runner。这有助于您重用Thread实例。
  • 注意:这些行代码不需要同步,如果需要,可以在处理方法中放置同步。

// Implement class Runner

public class Runner implements Runnable {
    private String mLine;

    public Runner(String line) {
        mLine = line;
    }

    @Override
    public void run() {
        process();
    }

    public void process() {
        // Do processing with mLine
        // Put synchronized if you need, it bases on your context
    }
}

// Initialize thread pool

private ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 100, 1000, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());

// Execute runner when receiving callback

onClick(String s) {
        Runner runner = new Runner(s);
        executor.execute(runner);
    }

答案 1 :(得分:0)

尝试更改如下

String sLine;
onClick(final String line){
                sLine = line;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    doProcessing(line);    

                }).start();     
}