ActivityManagerService服务线程启动源码分析【转】

本文转载自:http://blog.csdn.net/yangwen123/article/details/8177702

Android系统服务线程都驻留在SystemServer进程中,由SystemServer启动,在SystemServer.init2函数中,通过启动一个线程来启动各种系统服务线程。

[java] view plain copy

  1. public static final void init2() {
  2. Slog.i(TAG, "Entered the Android system server!");
  3. Thread thr = new ServerThread();// 创建一个线程
  4. thr.setName("android.server.ServerThread");//设置线程名称
  5. thr.start();/启动该线程
  6. }

android系统服务都是在thr线程的run函数中启动:

[java] view plain copy

  1. public void run() {
  2. EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,SystemClock.uptimeMillis());
  3. Looper.prepare();//创建一个消息循环对象
  4. android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
  5. BinderInternal.disableBackgroundScheduling(true);
  6. android.os.Process.setCanSelfBackground(false);
  7. // Critical services...
  8. try {
  9. Slog.i(TAG, "Activity Manager");
  10. //①启动ActivityManagerService服务线程
  11. context = ActivityManagerService.main(factoryTest);
  12. ................................................
  13. //②向ServiceManager注册自己
  14. ActivityManagerService.setSystemProcess();
  15. ................................................
  16. Slog.i(TAG, "System Content Providers");
  17. //③安装系统Providers
  18. ActivityManagerService.installSystemProviders();
  19. ................................................
  20. //④设置ActivityManagerService的成员变量mWindowManager
  21. ActivityManagerService.self().setWindowManager(wm);
  22. ................................................
  23. } catch (RuntimeException e) {
  24. Slog.e("System", "******************************************");
  25. Slog.e("System", "************ Failure starting core service", e);
  26. }
  27. //⑤调用systemReady函数为系统准备各种服务
  28. ActivityManagerService.self().systemReady(new Runnable() {
  29. public void run() {
  30. Slog.i(TAG, "Making services ready");
  31. startSystemUi(contextF);
  32. try {
  33. if (batteryF != null) batteryF.systemReady();
  34. } catch (Throwable e) {
  35. reportWtf("making Battery Service ready", e);
  36. }
  37. try {
  38. if (networkManagementF != null) networkManagementF.systemReady();
  39. } catch (Throwable e) {
  40. reportWtf("making Network Managment Service ready", e);
  41. }
  42. try {
  43. if (networkStatsF != null) networkStatsF.systemReady();
  44. } catch (Throwable e) {
  45. reportWtf("making Network Stats Service ready", e);
  46. }
  47. try {
  48. if (networkPolicyF != null) networkPolicyF.systemReady();
  49. } catch (Throwable e) {
  50. reportWtf("making Network Policy Service ready", e);
  51. }
  52. try {
  53. if (connectivityF != null) connectivityF.systemReady();
  54. } catch (Throwable e) {
  55. reportWtf("making Connectivity Service ready", e);
  56. }
  57. try {
  58. if (dockF != null) dockF.systemReady();
  59. } catch (Throwable e) {
  60. reportWtf("making Dock Service ready", e);
  61. }
  62. try {
  63. if (usbF != null) usbF.systemReady();
  64. } catch (Throwable e) {
  65. reportWtf("making USB Service ready", e);
  66. }
  67. try {
  68. if (uiModeF != null) uiModeF.systemReady();
  69. } catch (Throwable e) {
  70. reportWtf("making UI Mode Service ready", e);
  71. }
  72. try {
  73. if (recognitionF != null) recognitionF.systemReady();
  74. } catch (Throwable e) {
  75. reportWtf("making Recognition Service ready", e);
  76. }
  77. Watchdog.getInstance().start();
  78. // It is now okay to let the various system services start their
  79. // third party code...
  80. try {
  81. if (appWidgetF != null) appWidgetF.systemReady(safeMode);
  82. } catch (Throwable e) {
  83. reportWtf("making App Widget Service ready", e);
  84. }
  85. try {
  86. if (wallpaperF != null) wallpaperF.systemReady();
  87. } catch (Throwable e) {
  88. reportWtf("making Wallpaper Service ready", e);
  89. }
  90. try {
  91. if (immF != null) immF.systemReady(statusBarF);
  92. } catch (Throwable e) {
  93. reportWtf("making Input Method Service ready", e);
  94. }
  95. try {
  96. if (locationF != null) locationF.systemReady();
  97. } catch (Throwable e) {
  98. reportWtf("making Location Service ready", e);
  99. }
  100. try {
  101. if (countryDetectorF != null) countryDetectorF.systemReady();
  102. } catch (Throwable e) {
  103. reportWtf("making Country Detector Service ready", e);
  104. }
  105. try {
  106. if (throttleF != null) throttleF.systemReady();
  107. } catch (Throwable e) {
  108. reportWtf("making Throttle Service ready", e);
  109. }
  110. try {
  111. if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady();
  112. } catch (Throwable e) {
  113. reportWtf("making Network Time Service ready", e);
  114. }
  115. try {
  116. if (textServiceManagerServiceF != null) textServiceManagerServiceF.systemReady();
  117. } catch (Throwable e) {
  118. reportWtf("making Text Services Manager Service ready", e);
  119. }
  120. }
  121. });
  122. Looper.loop();
  123. Slog.d(TAG, "System ServerThread is exiting!");
  124. }

第一:ActivityManagerService.main(factoryTest)

[java] view plain copy

  1. public static final Context main(int factoryTest) {
  2. //①启动AThread线程来创建ActivityManagerService实例
  3. AThread thr = new AThread();
  4. thr.start();
  5. synchronized (thr) {
  6. while (thr.mService == null) {
  7. try {
  8. thr.wait();
  9. } catch (InterruptedException e) {
  10. }
  11. }
  12. }
  13. //将创建的ActivityManagerService实例保存到ActivityManagerService的静态变量mSelf
  14. ActivityManagerService m = thr.mService;
  15. mSelf = m;
  16. //②创建ActivityThread实例并保存到ActivityManagerService的静态变量mSystemThread
  17. ActivityThread at = ActivityThread.systemMain();
  18. mSystemThread = at;
  19. Context context = at.getSystemContext();
  20. context.setTheme(android.R.style.Theme_Holo);
  21. m.mContext = context;
  22. m.mFactoryTest = factoryTest;
  23. //③创建一个ActivityStack实例,并保存到ActivityManagerService的成员变量mMainStack中
  24. m.mMainStack = new ActivityStack(m, context, true);
  25. //④向ServiceManager注册BatteryStatsService服务
  26. m.mBatteryStatsService.publish(context);
  27. //⑤向ServiceManager注册UsageStatsService服务
  28. m.mUsageStatsService.publish(context);
  29. synchronized (thr) {
  30. //取消AThread线程等待,进入消息循环状态
  31. thr.mReady = true;
  32. thr.notifyAll();
  33. }
  34. //⑥调用startRunning函数
  35. m.startRunning(null, null, null, null);
  36. return context;
  37. }

①启动AThread线程

[java] view plain copy

  1. static class AThread extends Thread {
  2. ActivityManagerService mService;
  3. boolean mReady = false;
  4. public AThread() {
  5. super("ActivityManager");
  6. }
  7. public void run() {
  8. //创建消息循环对象
  9. Looper.prepare();
  10. android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
  11. android.os.Process.setCanSelfBackground(false);
  12. ActivityManagerService m = new ActivityManagerService();
  13. synchronized (this) {
  14. //创建ActivityManagerService实例
  15. mService = m;
  16. notifyAll();
  17. }
  18. //mReady = false,所以该线程处于等待
  19. synchronized (this) {
  20. while (!mReady) {
  21. try {
  22. wait();
  23. } catch (InterruptedException e) {
  24. }
  25. }
  26. }
  27. // For debug builds, log event loop stalls to dropbox for analysis.
  28. if (StrictMode.conditionallyEnableDebugLogging()) {
  29. Slog.i(TAG, "Enabled StrictMode logging for AThread‘s Looper");
  30. }
  31. //开启该线程的消息循环
  32. Looper.loop();
  33. }
  34. }

②创建ActivityThread实例

[java] view plain copy

  1. public static final ActivityThread systemMain() {
  2. HardwareRenderer.disable(true);
  3. ActivityThread thread = new ActivityThread();
  4. thread.attach(true);
  5. return thread;
  6. }

[java] view plain copy

  1. private void attach(boolean system) {
  2. //本地线程存储
  3. sThreadLocal.set(this);
  4. mSystemThread = system;//mSystemThread=true
  5. if (!system) {
  6. ViewRootImpl.addFirstDrawHandler(new Runnable() {
  7. public void run() {
  8. ensureJitEnabled();
  9. }
  10. });
  11. android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
  12. RuntimeInit.setApplicationObject(mAppThread.asBinder());
  13. IActivityManager mgr = ActivityManagerNative.getDefault();
  14. try {
  15. mgr.attachApplication(mAppThread);
  16. } catch (RemoteException ex) {
  17. // Ignore
  18. }
  19. } else {
  20. // Don‘t set application object here -- if the system crashes,
  21. // we can‘t display an alert, we just want to die die die.
  22. android.ddm.DdmHandleAppName.setAppName("system_process");
  23. try {
  24. mInstrumentation = new Instrumentation();
  25. ContextImpl context = new ContextImpl();
  26. context.init(getSystemContext().mPackageInfo, null, this);
  27. //创建Application实例,并保存在成员变量mAllApplications中
  28. Application app = Instrumentation.newApplication(Application.class, context);
  29. mAllApplications.add(app);
  30. mInitialApplication = app;
  31. //调用应用程序的onCreate函数
  32. app.onCreate();
  33. } catch (Exception e) {
  34. throw new RuntimeException(
  35. "Unable to instantiate Application():" + e.toString(), e);
  36. }
  37. }
  38. ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
  39. public void onConfigurationChanged(Configuration newConfig) {
  40. synchronized (mPackages) {
  41. // We need to apply this change to the resources
  42. // immediately, because upon returning the view
  43. // hierarchy will be informed about it.
  44. if (applyConfigurationToResourcesLocked(newConfig, null)) {
  45. // This actually changed the resources!  Tell
  46. // everyone about it.
  47. if (mPendingConfiguration == null ||
  48. mPendingConfiguration.isOtherSeqNewer(newConfig)) {
  49. mPendingConfiguration = newConfig;
  50. queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
  51. }
  52. }
  53. }
  54. }
  55. public void onLowMemory() {
  56. }
  57. public void onTrimMemory(int level) {
  58. }
  59. });
  60. }

③创建一个ActivityStack实例

[java] view plain copy

  1. ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
  2. mService = service;
  3. mContext = context;
  4. mMainStack = mainStack;
  5. PowerManager pm =(PowerManager)context.getSystemService(Context.POWER_SERVICE);
  6. mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
  7. mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
  8. mLaunchingActivity.setReferenceCounted(false);
  9. }

④注册BatteryStatsService服务

[java] view plain copy

  1. public void publish(Context context) {
  2. mContext = context;
  3. ServiceManager.addService("batteryinfo", asBinder());
  4. mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
  5. mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
  6. com.android.internal.R.integer.config_radioScanningTimeout)* 1000L);
  7. }

⑤注册UsageStatsService服务

[java] view plain copy

  1. public void publish(Context context) {
  2. mContext = context;
  3. ServiceManager.addService(SERVICE_NAME, asBinder());
  4. }

⑥调用startRunning函数startRunning(null, null, null, null)

[java] view plain copy

  1. public final void startRunning(String pkg, String cls, String action,String data) {
  2. synchronized(this) {
  3. //mStartRunning = false
  4. if (mStartRunning) {
  5. return;
  6. }
  7. mStartRunning = true;
  8. //mTopComponent=null
  9. mTopComponent = pkg != null && cls != null? new ComponentName(pkg, cls) : null;
  10. //mTopAction=Intent.ACTION_MAIN
  11. mTopAction = action != null ? action : Intent.ACTION_MAIN;
  12. //mTopData=null
  13. mTopData = data;
  14. if (!mSystemReady) {
  15. return;
  16. }
  17. }
  18. systemReady(null);
  19. }

[java] view plain copy

  1. public void systemReady(final Runnable goingCallback) {
  2. //goingCallback = null
  3. synchronized(this) {
  4. //mSystemReady = false
  5. if (mSystemReady) {
  6. if (goingCallback != null) goingCallback.run();
  7. return;
  8. }
  9. // mDidUpdate = false
  10. if (!mDidUpdate) {
  11. if (mWaitingUpdate) {
  12. return;
  13. }
  14. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
  15. List<ResolveInfo> ris = null;
  16. try {
  17. ris = AppGlobals.getPackageManager().queryIntentReceivers(intent, null, 0);
  18. } catch (RemoteException e) {
  19. }
  20. if (ris != null) {
  21. for (int i=ris.size()-1; i>=0; i--) {
  22. if ((ris.get(i).activityInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
  23. ris.remove(i);
  24. }
  25. }
  26. intent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE);
  27. ArrayList<ComponentName> lastDoneReceivers = readLastDonePreBootReceivers();
  28. final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
  29. for (int i=0; i<ris.size(); i++) {
  30. ActivityInfo ai = ris.get(i).activityInfo;
  31. ComponentName comp = new ComponentName(ai.packageName, ai.name);
  32. if (lastDoneReceivers.contains(comp)) {
  33. ris.remove(i);
  34. i--;
  35. }
  36. }
  37. for (int i=0; i<ris.size(); i++) {
  38. ActivityInfo ai = ris.get(i).activityInfo;
  39. ComponentName comp = new ComponentName(ai.packageName, ai.name);
  40. doneReceivers.add(comp);
  41. intent.setComponent(comp);
  42. IIntentReceiver finisher = null;
  43. if (i == ris.size()-1) {
  44. finisher = new IIntentReceiver.Stub() {
  45. public void performReceive(Intent intent, int resultCode,
  46. String data, Bundle extras, boolean ordered,
  47. boolean sticky) {
  48. // The raw IIntentReceiver interface is called
  49. // with the AM lock held, so redispatch to
  50. // execute our code without the lock.
  51. mHandler.post(new Runnable() {
  52. public void run() {
  53. synchronized (ActivityManagerService.this) {
  54. mDidUpdate = true;
  55. }
  56. writeLastDonePreBootReceivers(doneReceivers);
  57. showBootMessage(mContext.getText(
  58. R.string.android_upgrading_complete),false);
  59. systemReady(goingCallback);
  60. }
  61. });
  62. }
  63. };
  64. }
  65. Slog.i(TAG, "Sending system update to: " + intent.getComponent());
  66. broadcastIntentLocked(null, null, intent, null, finisher,
  67. 0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID);
  68. if (finisher != null) {
  69. mWaitingUpdate = true;
  70. }
  71. }
  72. }
  73. if (mWaitingUpdate) {
  74. return;
  75. }
  76. mDidUpdate = true;
  77. }
  78. mSystemReady = true;
  79. if (!mStartRunning) {
  80. return;
  81. }
  82. }
  83. ArrayList<ProcessRecord> procsToKill = null;
  84. synchronized(mPidsSelfLocked) {
  85. for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
  86. ProcessRecord proc = mPidsSelfLocked.valueAt(i);
  87. if (!isAllowedWhileBooting(proc.info)){
  88. if (procsToKill == null) {
  89. procsToKill = new ArrayList<ProcessRecord>();
  90. }
  91. procsToKill.add(proc);
  92. }
  93. }
  94. }
  95. synchronized(this) {
  96. if (procsToKill != null) {
  97. for (int i=procsToKill.size()-1; i>=0; i--) {
  98. ProcessRecord proc = procsToKill.get(i);
  99. Slog.i(TAG, "Removing system update proc: " + proc);
  100. removeProcessLocked(proc, true, false, "system update done");
  101. }
  102. }
  103. // Now that we have cleaned up any update processes, we
  104. // are ready to start launching real processes and know that
  105. // we won‘t trample on them any more.
  106. mProcessesReady = true;
  107. }
  108. Slog.i(TAG, "System now ready");
  109. EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,SystemClock.uptimeMillis());
  110. synchronized(this) {
  111. // Make sure we have no pre-ready processes sitting around.
  112. if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
  113. ResolveInfo ri = mContext.getPackageManager().resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),STOCK_PM_FLAGS);
  114. CharSequence errorMsg = null;
  115. if (ri != null) {
  116. ActivityInfo ai = ri.activityInfo;
  117. ApplicationInfo app = ai.applicationInfo;
  118. if ((app.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
  119. mTopAction = Intent.ACTION_FACTORY_TEST;
  120. mTopData = null;
  121. mTopComponent = new ComponentName(app.packageName,
  122. ai.name);
  123. } else {
  124. errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_not_system);
  125. }
  126. } else {
  127. errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_no_action);
  128. }
  129. if (errorMsg != null) {
  130. mTopAction = null;
  131. mTopData = null;
  132. mTopComponent = null;
  133. Message msg = Message.obtain();
  134. msg.what = SHOW_FACTORY_ERROR_MSG;
  135. msg.getData().putCharSequence("msg", errorMsg);
  136. mHandler.sendMessage(msg);
  137. }
  138. }
  139. }
  140. retrieveSettings();
  141. if (goingCallback != null) goingCallback.run();
  142. synchronized (this) {
  143. if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
  144. try {
  145. List apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS);
  146. if (apps != null) {
  147. int N = apps.size();
  148. int i;
  149. for (i=0; i<N; i++) {
  150. ApplicationInfo info= (ApplicationInfo)apps.get(i);
  151. if (info != null &&!info.packageName.equals("android")) {
  152. addAppLocked(info);
  153. }
  154. }
  155. }
  156. } catch (RemoteException ex) {
  157. // pm is in same process, this will never happen.
  158. }
  159. }
  160. // Start up initial activity.
  161. mBooting = true;
  162. try {
  163. if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
  164. Message msg = Message.obtain();
  165. msg.what = SHOW_UID_ERROR_MSG;
  166. mHandler.sendMessage(msg);
  167. }
  168. } catch (RemoteException e) {
  169. }
  170. mMainStack.resumeTopActivityLocked(null);
  171. }
  172. }

第二:ActivityManagerService.setSystemProcess()

[java] view plain copy

  1. public static void setSystemProcess() {
  2. try {
  3. ActivityManagerService m = mSelf;
  4. ServiceManager.addService("activity", m);
  5. ServiceManager.addService("meminfo", new MemBinder(m));
  6. ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
  7. if (MONITOR_CPU_USAGE) {
  8. ServiceManager.addService("cpuinfo", new CpuBinder(m));
  9. }
  10. ServiceManager.addService("permission", new PermissionController(m));
  11. //把应用程序框架层下面的android包加载进来
  12. ApplicationInfo info =mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);
  13. mSystemThread.installSystemApplicationInfo(info);
  14. synchronized (mSelf) {
  15. ProcessRecord app = mSelf.newProcessRecordLocked(
  16. mSystemThread.getApplicationThread(), info,info.processName);
  17. app.persistent = true;
  18. app.pid = MY_PID;
  19. app.maxAdj = ProcessList.SYSTEM_ADJ;
  20. mSelf.mProcessNames.put(app.processName, app.info.uid, app);
  21. synchronized (mSelf.mPidsSelfLocked) {
  22. mSelf.mPidsSelfLocked.put(app.pid, app);
  23. }
  24. mSelf.updateLruProcessLocked(app, true, true);
  25. }
  26. } catch (PackageManager.NameNotFoundException e) {
  27. throw new RuntimeException(
  28. "Unable to find android system package", e);
  29. }
  30. }

第三:ActivityManagerService.installSystemProviders()

[java] view plain copy

  1. public static final void installSystemProviders() {
  2. List<ProviderInfo> providers;
  3. synchronized (mSelf) {
  4. ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);
  5. providers = mSelf.generateApplicationProvidersLocked(app);
  6. if (providers != null) {
  7. for (int i=providers.size()-1; i>=0; i--) {
  8. ProviderInfo pi = (ProviderInfo)providers.get(i);
  9. if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
  10. Slog.w(TAG, "Not installing system proc provider " + pi.name
  11. + ": not system .apk");
  12. providers.remove(i);
  13. }
  14. }
  15. }
  16. }
  17. if (providers != null) {
  18. mSystemThread.installSystemProviders(providers);
  19. }
  20. mSelf.mCoreSettingsObserver = new CoreSettingsObserver(mSelf);
  21. mSelf.mUsageStatsService.monitorPackages();
  22. }

第三:ActivityManagerService.systemReady()

时间: 2024-10-24 22:29:53

ActivityManagerService服务线程启动源码分析【转】的相关文章

Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)

本文是在学习Openstack的过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正! 在Neutron-server服务加载与启动源码分析(二)中搞定模块功能的扩展和加载,我们就回到Neutron-server服务加载与启动源码分析(一)中的_run_wsgi函数 <span style="font-size:14px;">def _run_wsgi(app_name): app = config.load_paste_app(app_name) ifno

Android之rild进程启动源码分析

Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中: {数组中的索引号,请求回调函数,响应回调函数} [plain] view plaincopy {0, NULL, NULL},      

Netty 心跳服务之 IdleStateHandler 源码分析

前言:Netty 提供的心跳介绍 Netty 作为一个网络框架,提供了诸多功能,比如我们之前说的编解码,Netty 准备很多现成的编解码器,同时,Netty 还为我们准备了网络中,非常重要的一个服务-----心跳机制.通过心跳检查对方是否有效,这在 RPC 框架中是必不可少的功能. Netty 提供了 IdleStateHandler ,ReadTimeoutHandler,WriteTimeoutHandler 检测连接的有效性.当然,你也可以自己写个任务.但我们今天不准备使用自定义任务,而是

Django如何启动源码分析

Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字符串 解析manage.py #!/usr/bin/env python import os import sys if __name__ == "__main__": #os.environ.setdefault 方法可以修改系统环境变量,但是只能os.environ 只能影响到当前运行

SpringCloud(4)---Ribbon服务调用,源码分析

SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.8003. 各服务的配置文件这里我这边不在显示了,和上篇博客配置一样.博客地址:SpringCloud(3)---Eureka服务注册与发现 一.商品中心服务端 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> &l

【一起学源码-微服务】Nexflix Eureka 源码九:服务续约源码分析

前言 前情回顾 上一讲 我们讲解了服务发现的相关逻辑,所谓服务发现 其实就是注册表抓取,服务实例默认每隔30s去注册中心抓取一下注册表增量数据,然后合并本地注册表数据,最后有个hash对比的操作. 本讲目录 今天主要是看下服务续约的逻辑,服务续约就是client端给server端发送心跳检测,告诉对方我还活着.现在很多分布式系统都会有心跳检查的机制,这里一起来学习下Eureka是怎么做心跳检查的. 目录如下: client端心跳检查调度任务 server端接收心跳检查,设置最后renew时间 这

转:Memcached 线程部分源码分析

目前网上关于memcached的分析主要是内存管理部分,下面对memcached的线程模型做下简单分析 有不对的地方还请大家指正,对memcahced和libevent不熟悉的请先google之 先看下memcahced启动时线程处理的流程 memcached的多线程主要是通过实例化多个libevent实现的,分别是一个主线程和n个workers线程 无论是主线程还是workers线程全部通过libevent管理网络事件,实际上每个线程都是一个单独的libevent实例 主线程负责监听客户端的建

Android服务之bindService源码分析

上一篇分析startService时没有画出调用ActivityManagerService之前的时序图,这里画出bindService的时序图,它们的调用流程是一致的. 先看ContextWrapper的bindService方法: @Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, fl

Java并发编程中线程池源码分析及使用

当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnblogs.com/dolphin0520/p/3932921.html 由于原文作者使用的API 是1.6 版本的,参考他的文章,做了一些修改成 jdk 1.8版本的方法,涉及到的内容比较多,可能有少许错误. API : jdk1.8.0_144 ThreadPoolExecutor类 Java中线