core.async会自行停放,还是有“调度程序”?

时间:2016-06-12 21:03:05

标签: clojure core.async

据我了解,在JVM上有一个线程池可用于core.async go块,其中n + 2个线程数为n,其中import android.content.ClipData; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity { private ArrayList<ListItems> itemsList; private RecyclerView mRecyclerView; private MyRecyclerAdapter adapter; private List<String> courseStrings = new ArrayList<>(); private List<String> creditStrings = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); courseStrings.add(""); creditStrings.add(""); // Toast variable in order to fix toast queueing issue. final Toast toast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT); // For the recycler view. mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); itemsList = new ArrayList<>(); adapter = new MyRecyclerAdapter(MainActivity.this, itemsList, courseStrings, creditStrings); mRecyclerView.setAdapter(adapter); mRecyclerView.setLayoutManager(linearLayoutManager); // For the addCourse button. final Button addCourse = (Button) findViewById(R.id.addCourse); addCourse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.createListItem(new ListItems(null, null, false), toast); toast.setText("New course added"); toast.show(); } }); final Button clearAll = (Button) findViewById(R.id.clearAll); clearAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // In order to clear the list. if (itemsList.size() == 0) { toast.setText("All courses have already been cleared."); toast.show(); } else { adapter.clearAdapter(); toast.setText("All courses have been cleared."); toast.show(); } } }); // For the drag and drop/swipe to dismiss. ItemTouchHelper itemTouchHelper = new ItemTouchHelper( new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) { public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { final int fromPos = viewHolder.getAdapterPosition(); final int toPos = target.getAdapterPosition(); Collections.swap(itemsList, fromPos, toPos); adapter.notifyItemMoved(fromPos, toPos); return true; } public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { adapter.onItemDismiss(viewHolder.getAdapterPosition()); } }); itemTouchHelper.attachToRecyclerView(mRecyclerView); } // End of onCreate } // End of MainActivity 是机器上的核心数。 / p>

但是,许多go块可以同时部署在一个线程上。每个都处于停放状态(这意味着其计算没有进展)或处于运行状态(其中其计算围绕产生热量的核心嗡嗡声)。如果在四核机器上有1000个去块,那么我想在任何时候这些1000个块中最多有6个处于运行状态。因此必须停放其他994个挡块。

全线程被安排到核心;由OS调度程序或JVM管理程序线程。那么go块如何进入/退出停放状态?当它厌倦了运行(块)时是否决定驻留自己,或者是否有一个主管线程充当'去块调度器',它决定哪个go块在哪个线程上运行并受某些调度算法(如Round Robin等)的影响

由于

1 个答案:

答案 0 :(得分:2)

他们停在自己身边。

go宏遍历整个表单,找到需要停放的位置,并显式调用将线程停放在这些位置。一些常见的是:

  • 其他去块的开始
  • 取自陈<!
  • 发送给陈>!
  • 致电async/thread

这是阻止功能调用的重要原因。编译器/宏需要能够看到整个代码块,将它们放在正确的位置。