0

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

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

我已经编写了以下代码,但在此我认为在单独线程的整个处理也完成之前无法接收回调,从而破坏了这个新线程的全部目的。

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

                }).start(); 
}
}
4

2 回答 2

1

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

A:我认为你不需要在这里加锁。该字符串不被多线程访问。

但我不希望新线程(正在处理的地方)也被锁定。

答:我看到这里没有任何东西被锁定:) 我认为如果你这样做会更好:

  • 创建一个类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);
    }
于 2015-11-25T03:32:21.170 回答
0

尝试改变如下

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

                }).start();     
}
于 2013-04-10T12:30:48.553 回答