{"product_id":"138578","title":"The basics of Kotlin coroutines ","description":"\u003ccenter\u003e\u003cdiv style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/tmgdisk01.cafe24.com\/images\/vs\/4172\/sv\/3jXPCfFA4X4OhpyBkSmgzWCgPs2WHV.png?v=1765064711\" style=\"max-width:100%;max-height:10px\"\u003e\u003c\/div\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\n\n\u003cdiv style=\"width:95%\"\u003e\n\n\u003cdiv style=\"text-align:center;font-size:30px;font-weight:bolder;line-height:1.6em\"\u003e The basics of Kotlin coroutines \u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"border-bottom:1px;border-bottom-style:dotted;border-color:;padding-bottom:20px\"\u003e\u003ccenter\u003e\u003ctable align=\"center\" width=\"100%\"\u003e\u003ctbody style=\"border:0px\"\u003e\n\n\u003ctr\u003e\u003ctd align=\"center\" style=\"line-height:1.2em;text-align:center;font-size:18px;color:black;font-weight:bold;padding-bottom:20px;\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\u003ctr\u003e\u003ctd style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/image.yes24.com\/goods\/125014350\/XL\" style=\"max-width:100%;height:auto\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/center\u003e\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;{split_style6}padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e Description \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;word-break:break-all;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eBook Introduction\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e\u003cdiv\u003e This book is written so that anyone can easily understand asynchronous programming, which many developers find difficult, through various visual materials and explanations.\u003cbr\u003e This book is recommended for developers using Kotlin, including Android and Spring, who want to learn asynchronous programming using coroutines from the basics to advanced levels.\u003cbr\u003e\u003cbr\u003e\n\u003c\/div\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cul\u003e\u003cli\u003e You can preview some of the book's contents.\u003cbr\u003e \u003cspan\u003ePreview\u003c\/span\u003e\n\n\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\n\u003c\/div\u003e \",\"\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eindex\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e \u003cb\u003eChapter 1: Limitations of Thread-Based Work and the Emergence of Coroutines\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 1.1. JVM processes and threads\u003cbr\u003e 1.2.\u003cbr\u003e Limitations of Single-Threading and Multi-Threaded Programming\u003cbr\u003e 1.2.1.\u003cbr\u003e Limitations of single-threaded applications\u003cbr\u003e 1.2.2. \u003cbr\u003eOvercoming the limitations of single-threading through multi-threaded programming\u003cbr\u003e 1.3.\u003cbr\u003e Multithreaded programming using threads and thread pools\u003cbr\u003e 1.3.1.\u003cbr\u003e How to use the Thread class and its limitations\u003cbr\u003e 1.3.2.\u003cbr\u003e Using a thread pool through the Executor framework\u003cbr\u003e 1.3.3.\u003cbr\u003e Multithreaded programming and its limitations\u003cbr\u003e 1.4.\u003cbr\u003e Limitations of Traditional Multithreaded Programming and Coroutines\u003cbr\u003e 1.4.1.\u003cbr\u003e Limitations of existing multi-threaded programming\u003cbr\u003e 1.4.2.\u003cbr\u003e How do coroutines overcome thread blocking problems?\u003cbr\u003e 1.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 2 Setting up a Coroutine Development Environment\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 2.1.\u003cbr\u003e Installing and Exploring IntelliJ IDEA\u003cbr\u003e 2.1.1.\u003cbr\u003e Installing IntelliJ IDEA 58\u003cbr\u003e 2.2.\u003cbr\u003e Create a Kotlin project and explore its screen layout.\u003cbr\u003e 2.2.1.\u003cbr\u003e Create a project\u003cbr\u003e 2.2.2. Examining the IDE Configuration\u003cbr\u003e 2.3.\u003cbr\u003e Running your first coroutine\u003cbr\u003e 2.3.1.\u003cbr\u003e Adding the coroutine library\u003cbr\u003e 2.3.2.\u003cbr\u003e Running your first coroutine\u003cbr\u003e 2.4.\u003cbr\u003e Setting up a coroutine debugging environment\u003cbr\u003e 2.4.1.\u003cbr\u003e Print running threads\u003cbr\u003e 2.4.2. \u003cbr\u003ePrint the name of the running coroutine\u003cbr\u003e 2.4.3.\u003cbr\u003e Using launch to run additional coroutines\u003cbr\u003e 2.4.4.\u003cbr\u003e Adding a name to a coroutine using CoroutineName\u003cbr\u003e 2.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 3 CoroutineDispatcher\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 3.1.\u003cbr\u003e What is CoroutineDispatcher?\u003cbr\u003e 3.1.1.\u003cbr\u003e Examining the behavior of CoroutineDispatcher\u003cbr\u003e 3.1.2.\u003cbr\u003e The role of CoroutineDispatcher\u003cbr\u003e 3.2.\u003cbr\u003e Limited and Unlimited Dispatchers\u003cbr\u003e 3.3.\u003cbr\u003e Creating a restricted dispatcher\u003cbr\u003e 3.3.1.\u003cbr\u003e Creating a single-threaded dispatcher\u003cbr\u003e 3.3.2.\u003cbr\u003e Creating a multi-threaded dispatcher\u003cbr\u003e 3.4.\u003cbr\u003e Running a coroutine using CoroutineDispatcher\u003cbr\u003e 3.4.1.\u003cbr\u003e Using CoroutineDispatcher as a parameter of launch\u003cbr\u003e 3.4.2.\u003cbr\u003e Running a child coroutine using the parent coroutine's CoroutineDispatcher\u003cbr\u003e 3.5.\u003cbr\u003e Predefined CoroutineDispatcher\u003cbr\u003e 3.5.1.\u003cbr\u003e Dispatchers.IO\u003cbr\u003e 3.5.2.\u003cbr\u003e Dispatchers.Default\u003cbr\u003e 3.5.3.\u003cbr\u003e Limiting the use of Dispatchers.Default threads using limitedParallelism\u003cbr\u003e 3.5.4.\u003cbr\u003e Dispatchers.IO and Dispatchers.Default4 using a shared thread pool\u003cbr\u003e 3.5.5.\u003cbr\u003e Dispatchers.Main\u003cbr\u003e 3.6.\u003cbr\u003e summation\u003cbr\u003e \u003cbr\u003e\u003cb\u003eChapter 4: Coroutine Builders and Jobs\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 4.1.\u003cbr\u003e Sequential processing of coroutines using join\u003cbr\u003e 4.1.1.\u003cbr\u003e Problems when sequential processing is not possible\u003cbr\u003e 4.1.2.\u003cbr\u003e Sequential processing using the join function\u003cbr\u003e 4.2.\u003cbr\u003e Sequential processing of coroutines using joinAll\u003cbr\u003e 4.2.1.\u003cbr\u003e joinAll function\u003cbr\u003e 4.2.2.\u003cbr\u003e Try using the joinAll function\u003cbr\u003e 4.3.\u003cbr\u003e Starting a coroutine late using CoroutineStart.LAZY\u003cbr\u003e 4.3.1.\u003cbr\u003e Preparing to look at delayed start\u003cbr\u003e 4.3.2.\u003cbr\u003e Starting a coroutine late using CoroutineStart.LAZY\u003cbr\u003e 4.4.\u003cbr\u003e Canceling a coroutine\u003cbr\u003e 4.4.1.\u003cbr\u003e Canceling a Job Using Cancel\u003cbr\u003e 4.4.2.\u003cbr\u003e Sequential processing using cancelAndJoin\u003cbr\u003e 4.5.\u003cbr\u003e Confirming cancellation of coroutine\u003cbr\u003e 4.5.1.\u003cbr\u003e Cancellation confirmation using delay\u003cbr\u003e 4.5.2.\u003cbr\u003e Cancellation confirmation using yield\u003cbr\u003e 4.5.3.\u003cbr\u003e Checking for cancellation using CoroutineScope.isActive\u003cbr\u003e 4.6.\u003cbr\u003e Coroutine status and Job status variables\u003cbr\u003e 4.6.1.\u003cbr\u003e Create a function that prints the status of a job\u003cbr\u003e 4.6.2.\u003cbr\u003e Coroutine in creation state\u003cbr\u003e 4.6.3.\u003cbr\u003e Coroutine in running state\u003cbr\u003e 4.6.4.\u003cbr\u003e Coroutine in execution completed state\u003cbr\u003e 4.6.5.\u003cbr\u003e Canceling coroutine\u003cbr\u003e 4.6.6.\u003cbr\u003e Cancelled coroutine\u003cbr\u003e 4.6.7. \u003cbr\u003eStatus Summary\u003cbr\u003e 4.7.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 5 Async and Deferred\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 5.1.\u003cbr\u003e Receiving the result using async\u003cbr\u003e 5.1.1.\u003cbr\u003e Creating a Deferred using async\u003cbr\u003e 5.1.2.\u003cbr\u003e Receiving result values ​​using await\u003cbr\u003e 5.2.\u003cbr\u003e Deferred is a special type of job\u003cbr\u003e 5.3.\u003cbr\u003e Receiving results from multiple coroutines\u003cbr\u003e 5.3.1.\u003cbr\u003e Receiving results from multiple coroutines using await\u003cbr\u003e 5.3.2.\u003cbr\u003e Receiving the result using awaitAll\u003cbr\u003e 5.3.3.\u003cbr\u003e Using awaitAll on collections\u003cbr\u003e 5.4.\u003cbr\u003e withContext\u003cbr\u003e 5.4.1.\u003cbr\u003e Replacing async-await with withContext\u003cbr\u003e 5.4.2.\u003cbr\u003e How withContext works\u003cbr\u003e 5.4.3.\u003cbr\u003e Precautions when using withContext\u003cbr\u003e 5.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 6 CoroutineContext\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 6.1.\u003cbr\u003e Components of CoroutineContext\u003cbr\u003e 6.2.\u003cbr\u003e Configuring CoroutineContext\u003cbr\u003e 6.2.1.\u003cbr\u003e How CoroutineContext Manages Components\u003cbr\u003e 6.2.2.\u003cbr\u003e Configuring CoroutineContext\u003cbr\u003e 6.2.3.\u003cbr\u003e Overriding the CoroutineContext component\u003cbr\u003e 6.2.4.\u003cbr\u003e Combining CoroutineContexts with Multiple Components\u003cbr\u003e 6.2.5.\u003cbr\u003e Create a Job and add it to CoroutineContext\u003cbr\u003e 6.3.\u003cbr\u003e Accessing the CoroutineContext component\u003cbr\u003e 6.3.1. \u003cbr\u003eKeys of CoroutineContext component\u003cbr\u003e 6.3.2.\u003cbr\u003e Accessing CoroutineContext components using keys\u003cbr\u003e 6.4.\u003cbr\u003e Removing the CoroutineContext component\u003cbr\u003e 6.4.1.\u003cbr\u003e Removing elements using minusKey\u003cbr\u003e 6.4.2.\u003cbr\u003e Things to note when using the minusKey function\u003cbr\u003e 6.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 7 Structured Concurrency\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 7.1.\u003cbr\u003e Execution environment inheritance\u003cbr\u003e 7.1.1.\u003cbr\u003e Inheriting the execution environment of the parent coroutine\u003cbr\u003e 7.1.2.\u003cbr\u003e Overwrite the execution environment\u003cbr\u003e 7.1.3.\u003cbr\u003e Non-inherited Job\u003cbr\u003e 7.1.4.\u003cbr\u003e Job used for structuring\u003cbr\u003e 7.2.\u003cbr\u003e Structuring and Task Control of Coroutines\u003cbr\u003e 7.2.1.\u003cbr\u003e Propagation of cancellation\u003cbr\u003e 7.2.2.\u003cbr\u003e Completion dependency of a parent coroutine on its child coroutine\u003cbr\u003e 7.3.\u003cbr\u003e Managing coroutines using CoroutineScope\u003cbr\u003e 7.3.1.\u003cbr\u003e Creating a CoroutineScope\u003cbr\u003e 7.3.2.\u003cbr\u003e CoroutineScope, which provides an execution environment for coroutines.\u003cbr\u003e 7.3.3.\u003cbr\u003e The scope of a coroutine belonging to CoroutineScope\u003cbr\u003e 7.3.4.\u003cbr\u003e Canceling CoroutineScope\u003cbr\u003e 7.3.5.\u003cbr\u003e Checking CoroutineScope activation status\u003cbr\u003e 7.4.\u003cbr\u003e Structuring and Job\u003cbr\u003e 7.4.1.\u003cbr\u003e runBlocking and the root Job\u003cbr\u003e 7.4.2.\u003cbr\u003e Breaking the Job Structure\u003cbr\u003e 7.4.3. \u003cbr\u003eUsing Jobs to prevent only some coroutines from being canceled\u003cbr\u003e 7.4.4.\u003cbr\u003e Explicitly set the parent of the created Job\u003cbr\u003e 7.4.5.\u003cbr\u003e The created job does not automatically complete execution.\u003cbr\u003e 7.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 8 Exception Handling\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 8.1.\u003cbr\u003e Exception propagation in coroutines\u003cbr\u003e 8.1.1.\u003cbr\u003e How exceptions propagate in coroutines\u003cbr\u003e 8.1.2.\u003cbr\u003e Exception propagation through examples\u003cbr\u003e 8.2.\u003cbr\u003e Exception propagation restrictions\u003cbr\u003e 8.2.1.\u003cbr\u003e Limiting exception propagation using Job objects\u003cbr\u003e 8.2.2.\u003cbr\u003e Limiting exception propagation using the SupervisorJob object\u003cbr\u003e 8.2.3.\u003cbr\u003e Limiting exception propagation using supervisorScope\u003cbr\u003e 8.3.\u003cbr\u003e Exception handling using CoroutineExceptionHandler\u003cbr\u003e 8.3.1.\u003cbr\u003e Create CoroutineExceptionHandler\u003cbr\u003e 8.3.2.\u003cbr\u003e Use CoroutineExceptionHandler\u003cbr\u003e 8.3.3.\u003cbr\u003e CoroutineExceptionHandler, which only handles unhandled exceptions\u003cbr\u003e 8.3.4.\u003cbr\u003e Make CoroutineExceptionHandler handle exceptions\u003cbr\u003e 8.3.5.\u003cbr\u003e CoroutineExceptionHandler does not limit exception propagation.\u003cbr\u003e 8.4.\u003cbr\u003e Exception handling using try catch statements\u003cbr\u003e 8.4.1.\u003cbr\u003e Handling coroutine exceptions using try catch statements\u003cbr\u003e 8.4.2. \u003cbr\u003eThe try catch statement for the coroutine builder function does not catch the coroutine's exceptions.\u003cbr\u003e 8.5.\u003cbr\u003e async exception handling\u003cbr\u003e 8.5.1.\u003cbr\u003e async exception exposure\u003cbr\u003e 8.5.2.\u003cbr\u003e async exception propagation\u003cbr\u003e 8.6.\u003cbr\u003e Non-propagated exceptions\u003cbr\u003e 8.6.1.\u003cbr\u003e CancellationException not propagated\u003cbr\u003e 8.6.2.\u003cbr\u003e JobCancellationException used when canceling a coroutine\u003cbr\u003e 8.6.3.\u003cbr\u003e Limiting a coroutine's execution time using withTimeOut\u003cbr\u003e 8.7.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 9 Suspend Functions\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 9.1.\u003cbr\u003e Suspending functions and coroutines\u003cbr\u003e 9.1.1.\u003cbr\u003e What is a suspend function?\u003cbr\u003e 9.1.2.\u003cbr\u003e Suspending functions are not coroutines\u003cbr\u003e 9.1.3.\u003cbr\u003e Running a suspending function in a separate coroutine\u003cbr\u003e 9.2.\u003cbr\u003e Using the suspend function\u003cbr\u003e 9.2.1.\u003cbr\u003e Callable points of the suspend function\u003cbr\u003e 9.2.2.\u003cbr\u003e Running a coroutine from a suspending function\u003cbr\u003e 9.3.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 10: Understanding Coroutines\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 10.1.\u003cbr\u003e Subroutines and Coroutines\u003cbr\u003e 10.1.1.\u003cbr\u003e Routines and subroutines\u003cbr\u003e 10.1.2.\u003cbr\u003e Difference between subroutines and coroutines\u003cbr\u003e 10.2.\u003cbr\u003e Thread yielding in coroutines\u003cbr\u003e 10.2.1. \u003cbr\u003eUnderstanding thread yielding through the delay suspend function\u003cbr\u003e 10.2.2.\u003cbr\u003e Learn more about how join and await work.\u003cbr\u003e 10.2.3.\u003cbr\u003e Call the yield function to yield the thread\u003cbr\u003e 10.3.\u003cbr\u003e Coroutine execution thread\u003cbr\u003e 10.3.1.\u003cbr\u003e The execution thread of a coroutine is not fixed.\u003cbr\u003e 10.3.2.\u003cbr\u003e If you don't yield the thread, the execution thread won't change.\u003cbr\u003e 10.4.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 11: Coroutines in Detail\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 11.1.\u003cbr\u003e Problems with coroutines using shared state and data synchronization\u003cbr\u003e 11.1.1.\u003cbr\u003e Problems with using mutable variables\u003cbr\u003e 11.1.2. How the JVM's memory space is connected to the hardware memory structure.\u003cbr\u003e 11.1.3.\u003cbr\u003e Memory visibility issues and solutions for shared state\u003cbr\u003e 11.1.4.\u003cbr\u003e Race Condition Problems and Solutions for Shared State\u003cbr\u003e 11.2.\u003cbr\u003e Explore the various options of CoroutineStart\u003cbr\u003e 11.2.1.\u003cbr\u003e CoroutineStart.DEFAULT\u003cbr\u003e 11.2.2.\u003cbr\u003e CoroutineStart.ATOMIC\u003cbr\u003e 11.2.3.\u003cbr\u003e CoroutineStart.UNDISPATCHED\u003cbr\u003e 11.3.\u003cbr\u003e Unlimited dispatcher\u003cbr\u003e 11.3.1.\u003cbr\u003e What is Unlimited Dispatcher?\u003cbr\u003e 11.3.2.\u003cbr\u003e Unlimited Dispatcher Features\u003cbr\u003e 11.4. \u003cbr\u003eHow Coroutines Work and Continuation\u003cbr\u003e 11.4.1.\u003cbr\u003e Continuation Passing Style\u003cbr\u003e 11.4.2.\u003cbr\u003e Understanding Continuation through Suspending and Resuming Coroutines\u003cbr\u003e 11.4.3.\u003cbr\u003e Resuming a coroutine by receiving results from another task\u003cbr\u003e 11.5.\u003cbr\u003e summation\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapter 12 Coroutine Unit Testing\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 12.1.\u003cbr\u003e Unit Testing Basics\u003cbr\u003e 12.1.1.\u003cbr\u003e What is a unit test?\u003cbr\u003e 12.1.2.\u003cbr\u003e Setting up a test environment\u003cbr\u003e 12.1.3.\u003cbr\u003e Creating and running a simple test\u003cbr\u003e 12.1.4.\u003cbr\u003e Setting up a test environment using the @BeforeEach annotation\u003cbr\u003e 12.1.5.\u003cbr\u003e Testing Dependent Objects Using Test Doubles\u003cbr\u003e 12.2.\u003cbr\u003e Getting Started with Coroutine Unit Testing\u003cbr\u003e 12.2.1.\u003cbr\u003e Writing Your First Coroutine Test\u003cbr\u003e 12.2.2.\u003cbr\u003e Limitations of testing using runBlocking\u003cbr\u003e 12.3.\u003cbr\u003e Coroutine testing library\u003cbr\u003e 12.3.1.\u003cbr\u003e Setting up coroutine test library dependencies\u003cbr\u003e 12.3.2.\u003cbr\u003e Running tests in virtual time using TestCoroutineScheduler\u003cbr\u003e 12.3.3.\u003cbr\u003e StandardTestDispatcher with TestCoroutineScheduler\u003cbr\u003e 12.3.4. \u003cbr\u003eRunning tests in virtual time using TestScope\u003cbr\u003e 12.3.5.\u003cbr\u003e Creating tests using runTest\u003cbr\u003e 12.4.\u003cbr\u003e Creating a coroutine unit test\u003cbr\u003e 12.4.1.\u003cbr\u003e Preparing Code for Coroutine Unit Testing\u003cbr\u003e 12.4.2.\u003cbr\u003e Writing Tests for the FollowerSearcher Class\u003cbr\u003e 12.5.\u003cbr\u003e Deepening Coroutine Testing\u003cbr\u003e 12.5.1.\u003cbr\u003e Tests on objects that execute new coroutines inside functions\u003cbr\u003e 12.5.2.\u003cbr\u003e Creating tests using backgroundScope\u003cbr\u003e 12.6.\u003cbr\u003e summation\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e \",\"\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eDetailed image\u003c\/b\u003e \u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cdiv\u003e\u003cimg src=\"https:\/\/image.yes24.com\/momo\/TopCate4758\/MidCate001\/475705202.jpg\" border=\"0\" alt=\"Detailed Image 1\"\u003e\u003c\/div\u003e\u003c\/div\u003e \",\"\u003cdiv\u003e\u003ch5\u003e \u003cb\u003ePublisher's Review\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e \u003cb\u003eWhat this book covers\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e - It explains asynchronous programming using coroutines so that even beginner developers can easily understand it through rich visual materials.\u003cbr\u003e - Explains the limitations of multi-threaded programming before coroutines and how coroutines overcome those limitations.\u003cbr\u003e - Explains how to utilize the various components that make up CoroutineContext. \u003cbr\u003e- Learn about structured concurrency and exception handling methods of coroutines and explain how to make asynchronous programming stable.\u003cbr\u003e - Provides materials for an in-depth understanding of how coroutines work.\u003cbr\u003e - Explains from basic to advanced how to write coroutine unit tests.\u003cbr\u003e\u003cbr\u003e \u003cb\u003eTarget audience for this book\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e - Developers who want to build a solid foundation of knowledge about Kotlin coroutines from the basics to the core.\u003cbr\u003e - Developers who want to grow technically by deeply understanding the various functions of coroutines.\u003cbr\u003e - Developers who want to learn how to make asynchronous programming more stable by understanding the structured concurrency and exception handling of coroutines.\u003cbr\u003e - Developers who want to understand how coroutines work\u003cbr\u003e - Developers who want to learn how to write coroutine unit tests\u003cbr\u003e\u003cbr\u003e \u003cb\u003eStructure of this book\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e Chapter 1 covers processes and threads in the JVM. \u003cbr\u003eWe will explore how traditional multi-threaded programming has changed and how coroutines overcome the limitations of traditional multi-threaded programming.\u003cbr\u003e Chapter 2 covers how to set up a coroutine development environment using IntelliJ IDEA.\u003cbr\u003e After setting up the development environment, we'll run our first coroutine and learn how to determine which thread the coroutine is running on.\u003cbr\u003e Chapter 3 covers CoroutineDispatcher.\u003cbr\u003e Explains how to create a bounded dispatcher and how to execute a coroutine using the bounded dispatcher.\u003cbr\u003e The coroutine library provides predefined CoroutineDispatchers for your convenience, so let's take a look at what types of predefined CoroutineDispatchers there are and when to use them.\u003cbr\u003e Chapter 4 covers the coroutine builder function launch and the Job object returned when launch is called. \u003cbr\u003eSince coroutines can be suspended, sequential processing between tasks is very important.\u003cbr\u003e We will learn how to use the join function of the Job object to sequentially process coroutines, and how to manipulate the state of coroutines and check the state value through the Job object.\u003cbr\u003e\u003cbr\u003e Chapter 5 explains async coroutine builders.\u003cbr\u003e We'll learn how to use async and await to return values ​​from coroutines, and how to use withContext to change the thread on which a coroutine is running.\u003cbr\u003e In Chapter 6, we will learn about CoroutineContext.\u003cbr\u003e Understand that Job, CoroutineDispatcher, and CoroutineName are components of CoroutineContext, and see how to combine or separate components of CoroutineContext.\u003cbr\u003e Chapter 7 explores how structured concurrency is used to safely use coroutines, focusing on the relationship between parent and child coroutines. \u003cbr\u003eAfterwards, we will learn about CoroutineScope, which plays an important role in structuring, and see that Job is at the center of structuring.\u003cbr\u003e Chapter 8 covers exception handling.\u003cbr\u003e We will learn how exceptions are propagated when they occur in a coroutine and confirm that exception propagation occurs due to structured concurrency.\u003cbr\u003e And we'll cover how to use supervisorScope or SupervisorJob to limit the scope to which exceptions can propagate.\u003cbr\u003e Additionally, it explains how to handle propagated exceptions using try catch statements or Coroutine ExceptionHandler.\u003cbr\u003e\u003cbr\u003e Chapter 9 covers suspend functions.\u003cbr\u003e Understand that suspending functions are reusable blocks of code and learn what to be careful of when using suspending functions. \u003cbr\u003eAfterwards, we will look at where we can call a suspending function, and how to create a CoroutineScope inside a suspending function without breaking its structure, and run a new child coroutine.\u003cbr\u003e Chapter 10 builds on the previous chapters by covering topics that deepen your understanding of coroutines.\u003cbr\u003e We'll explore the difference between subroutines and coroutines, why yielding threads is important for coroutines to work cooperatively, and what happens when a coroutine is suspended and then resumed.\u003cbr\u003e Chapter 11 explores advanced topics in coroutines.\u003cbr\u003e This article explains data synchronization issues when there are multiple coroutines using shared state in a multi-threaded environment, how to change the execution method of a coroutine using the CoroutineStart option, how the unbounded dispatcher works, and how coroutine suspension and resumption occur. \u003cbr\u003eChapter 12 covers coroutine unit testing.\u003cbr\u003e Learn how to use the coroutine test library and how to best conduct coroutine unit tests.\u003cbr\u003e\u003cbr\u003e \u003cb\u003eAuthor's Note\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e As developers create programs, they encounter numerous situations that require asynchronous programming.\u003cbr\u003e In the process, you will overcome numerous difficulties and find solutions for each situation, grow, and become familiar with asynchronous programming.\u003cbr\u003e Asynchronous programming is essential for creating high-performance programs, so understanding asynchronous programming is essential to becoming a competent developer.\u003cbr\u003e However, there are not many learning materials about asynchronous programming.\u003cbr\u003e Additionally, most of these learning materials are written for developers with a certain level of skill, making them difficult for developers who are just starting out to understand. \u003cbr\u003eKotlin coroutines are no exception.\u003cbr\u003e Coroutines are an asynchronous solution that combines performance, safety, and readability, and it is clear that they will become the standard for asynchronous programming in Kotlin for a long time to come.\u003cbr\u003e Accordingly, many developers have started using coroutines in their work, but there is still a lack of learning materials, and most of them are difficult to understand, especially for beginner developers.\u003cbr\u003e\u003cbr\u003e I have tried several things to make coroutines more accessible to developers.\u003cbr\u003e I also posted a series of articles on my technical blog, compiling English books, lectures, and official documentation, and translated the official Coroutine technical documentation into Korean and distributed it on the web.\u003cbr\u003e Although the attempts were well-received, there were limitations to systematically handling coroutines.\u003cbr\u003e Then, I started writing with the thought that I could convey coroutines more systematically through a book. \u003cbr\u003eThis book will cover coroutines systematically.\u003cbr\u003e It covers the characteristics of traditional multi-threaded programming, how coroutines overcome the limitations of traditional multi-threaded programming, what the components of coroutines are and how to use them, etc.\u003cbr\u003e This book will help you understand not only how to use coroutines but also what they are trying to solve.\u003cbr\u003e And I've structured it so that you can understand all of this if you only know the Kotlin language.\u003cbr\u003e I hope that this book will help many developers gain a deeper understanding of coroutines.\u003cbr\u003e\n\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e \"]\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e GOODS SPECIFICS \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eDate of issue:\u003c\/strong\u003e February 29, 2024\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003ePage count, weight, size:\u003c\/strong\u003e 452 pages | 188*235*21mm\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN13:\u003c\/strong\u003e 9791161758251\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN10:\u003c\/strong\u003e 1161758259 \u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cspan\u003e\u003c\/span\u003e\n\n\u003c\/center\u003e\n\n\n\u003c\/center\u003e","brand":"LIBRAIRIE COREENNE","offers":[{"title":"Default Title","offer_id":43893259894826,"sku":"138578","price":44.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0683\/2750\/5962\/files\/16e08bfc71f9a5fd777e0d5aa6f0dadf.jpg?v=1765394454","url":"https:\/\/librairie.coreenne.fr\/en\/products\/138578","provider":"LIBRAIRIE COREENNE","version":"1.0","type":"link"}