2016-07-04 25 views
0

我试图设计一个使用由Executors.newSingleThreadExecutor()做了一个工作线程的Android应用线程本地高速缓存的内存在被销毁时刷新到主内存???

但是我只想说工作者线程来处理,同时节省一些信息属于由主线程发送的连续任务工作者线程。 (然而,问题是,我发现当newSingleThreadExecutor闲置长期主线程不需要知道,就在工作线程应该保持信息的内部。

// State saver class , once made by main thread only accessed by worker thread 

public class StateSaver{ 

    public int count; 

} 

// Runnable obj that will be sent to worker thread from main thread 
public class rnbl implements Runnable{ 

    final public StateSaver sv; 

    public rnbl(StateSaver sv){ 
     this.sv = sv; 
    } 

    @Override 
    public void run(){ 
     sv.count++; 
    } 
} 

// Main Thread 

ExecutorService ex = Executors.newSingleThreadExecutor(); 

StateSaver sv = new StateSaver(); 

public void functionCalledByMainThread(){ 



    ex.submit(new rnbl(sv)); 

} 

,它可能只是破坏通过它线程制作并在需要时用新的替换它

所以我很担心的是,如果像下面的情况发生什么?

  1. 工作者线程中更新的状态变量

  2. 变量是在线程缓存内存更新,但不会应用到主存储器,但(变量不应是挥发性的)

  3. 工作者线程被破坏

  4. 更新从未应用于主内存...

然后,如果执行程序创建一个新的线程继续与任务,保存的状态可能是不正确的权利?当然,使用volatile会很容易,但我不需要使用volatile。或者它保证当一个线程被销毁时,它对变量所做的所有更改都会刷新到主内存中?

+0

为什么你需要不使用volatile? –

+0

其实我只是有点好奇...也许我应该至少使用一个易变的变量来缓存下来的主要内存 –

回答

1

如果要确保由其他线程可见的线程所做的更改,则可以使用Thread.join()。这给你一个保证发生之前的关系。

例如:

Thread t = new Thread(new SomeRunnable()); 
t.start(); 
// do stuff 
t.join(); 
// After the 'join', all memory writes made by Thread t are 
// guaranteed to be visible to the current thread. 

但你实际上问的ExecutorService,其中该线程将无法使用你“加入”。

以下内存一致性保证申请ExecutorService:在之前提交RunnableCallable任务的一个ExecutorService发生,之前任何行动通过该任务,采取了线程

操作这反过来发生 - 在之前,结果通过Future.get()检索。

因此,获得所需一致性的方法是在Future上为该任务调用get()

+0

谢谢,我想我现在应该了解未来,我从来没有用过 –

1

ExecutorService只能在'run()'方法完成后才能删除线程。只需执行线程生命周期的自定义协议(在等待和处理消息或直接刷新状态并消除特殊消息的情况下实时消耗):

class App { 
    static final String KILLER_MSG = "KILLER"; 
    public static void main(String[] args) { 
     BlockingQueue<String> tasks = new ArrayBlockingQueue<String>(256); 
     ExecutorService pool = Executors.newCachedThreadPool(); 

     // master/task producer 
     pool.submit(() -> { 
      tasks.add("task-0"); 
      tasks.add("task-1"); 
      tasks.add("task-2"); 
      tasks.add(KILLER_MSG); 
     }); 

     // slave/task consumer/worker 
     pool.submit(() -> { 
      while (true) { 
       String task = tasks.take(); 
       if (KILLER_MSG.equals(task)) { 
        // flush state here 
        break; // and die 
       } else { 
        // process 'task' here 
        System.out.println("TASK: " + task); 
       } 
      } 
     }); 
    } 
} 
相关问题