有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java同步锁和独立线程:Android

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

有人能帮我弄清楚这个的设计吗

我已经编写了下面的代码,但是在这段代码中,我认为在单独线程的整个处理完成之前,不会收到回调,从而破坏了这个新线程的整体用途

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

                }).start(); 
}
}

共 (2) 个答案

  1. # 1 楼答案

    试着像下面这样改变

    String sLine;
    onClick(final String line){
                    sLine = line;
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                        doProcessing(line);    
    
                    }).start();     
    }
    
  2. # 2 楼答案

    Also, since multiple callbacks can come simultaneously, I would like to have a synchronized lock till i pass the string into the new thread.

    我认为你不需要在这里上锁。多线程无法访问此字符串

    But I do not wish to have the new thread (where processing is going on) to be locked also.

    答:我看到这里什么也没锁上:)我想如果你这样做会更好:

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

    // 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);
        }