任何人都能告诉我指针调用和引用调用之间的确切差异.实际上这两种情况都发生了什么?
例如:
按参考呼叫:
void swap(int &x, int &y)
{
int temp;
temp = x; /* save the value at address x */
x = y; /* put y into x */
y = temp; /* put x into y */
return;
}
swap(a, b);
Run Code Online (Sandbox Code Playgroud)
通过指针调用:
void swap(int *x, int *y)
{
int temp;
temp = *x; /* save the value at address x */
*x = *y; /* put y into x */
*y = temp; /* put x into …Run Code Online (Sandbox Code Playgroud) 当流源是a时,我无法实现流处理的良好并行化Reader.在四核CPU上运行下面的代码我首先观察到3个核心,然后突然下降到两个核心,然后是一个核心.整体CPU利用率徘徊在50%左右.
请注意示例的以下特征:
这意味着所有压力都在CPU上,I/O很小.这个例子是一个用于自动并行化的坐鸭.
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
... class imports elided ...
public class Main
{
static final AtomicLong totalTime = new AtomicLong();
public static void main(String[] args) throws IOException {
final long start = System.nanoTime();
final Path inputPath = createInput();
System.out.println("Start processing");
try (PrintWriter w = new PrintWriter(Files.newBufferedWriter(Paths.get("output.txt")))) {
Files.lines(inputPath).parallel().map(Main::processLine)
.forEach(w::println);
}
final double cpuTime = totalTime.get(),
realTime = System.nanoTime()-start;
final int cores = Runtime.getRuntime().availableProcessors();
System.out.println(" Cores: " + cores);
System.out.format(" CPU …Run Code Online (Sandbox Code Playgroud) Kotlin如何在内部实现协同程序?
Coroutines被称为线程的"更轻版本",我知道它们在内部使用线程来执行协程.
当我使用任何构建器函数启动协程时会发生什么?
这是我对运行此代码的理解:
GlobalScope.launch { <---- (A)
val y = loadData() <---- (B) // suspend fun loadData()
println(y) <---- (C)
delay(1000) <---- (D)
println("completed") <---- (E)
}
Run Code Online (Sandbox Code Playgroud)
ThreadPool在开始时有一个预定义.(A),Kotlin开始在下一个可用的免费线程中执行协程(Say Thread01).(B),Kotlin停止执行当前线程,并loadData()在下一个可用的空闲线程(Thread02)中启动挂起功能.(B)执行后返回时,科特林延续了协程的下一个可用的空闲线程(Thread03).(C)执行Thread03.(D),Thread03停止.(E)在下一个免费线程上执行,比方说Thread01.我理解正确吗?或者协程以不同的方式实现?
我是协同程序的新手,我理解启动和异步,但仍然令人困惑的部分推迟.延期是什么?并且在工作和延迟之间有所不同.清除解释和示例更有帮助.提前致谢
当我关闭Tomcat时,我观察到Spring WebApplicationContext的正确关闭和清理.但是,当我重新部署基于Spring的WAR(通过将新WAR复制到webapps)时,不会发生正常关闭.由于所有随后的资源泄漏,这对我来说是一个问题:
org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [] appears to have started a thread named [hz.hazelcast-swipe-instance.scheduled] but has failed to stop it. This is very likely to create a memory leak.
org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [] appears to have started a thread named [hz.hazelcast-swipe-instance.operation.thread-0] but has failed to stop it. This is very likely to create a memory leak.
Run Code Online (Sandbox Code Playgroud)
... 还有很多.我使用的是无XML配置,这是我的WebApplicationInitializer:
public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override protected Class<?>[] getRootConfigClasses() {
return new Class[] …Run Code Online (Sandbox Code Playgroud) 现在我正在使用递归回溯,我的任务是找到迷宫中最长的路径,质量表示为用坐标覆盖的字段,并且墙壁的坐标在文件中是酸痛的.我已经制作了一个解析器来解析输入文件并构建墙,但是我还将这个坐标存储在一个对象类型Coordinate的数组中,以检查是否有可能在下一个上移动下一段"蛇"字段,然后我创建了这个方法,现在我已经明白我需要一个方法来从数组中删除最后一个坐标,当我使用回溯时,我该怎么办?目标不是使用数组列表或链表只有数组!谢谢!
public class Coordinate {
int xCoord;
int yCoord;
Coordinate(int x,int y) {
this.xCoord=x;
this.yCoord=y;
}
public int getX() {
return this.xCoord;
}
public int getY() {
return this.yCoord;
}
public String toString() {
return this.xCoord + "," + this.yCoord;
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Row {
static final int MAX_NUMBER_OF_COORD=1000;
Coordinate[] coordArray;
int numberOfElements;
Row(){
coordArray = new Coordinate[MAX_NUMBER_OF_COORD];
numberOfElements=0;
}
void add(Coordinate toAdd) {
coordArray[numberOfElements]=toAdd;
numberOfElements +=1;
}
boolean ifPossible(Coordinate c1){
for(int i=0;i<numberOfElements;i++){
if(coordArray[i].xCoord==c1.xCoord && coordArray[i].yCoord==c1.yCoord){
return false; …Run Code Online (Sandbox Code Playgroud) Java要求线程o在调用之前拥有监视器o.wait()或o.notify().这是一个众所周知的事实.但是,从根本上要求任何此类机制工作的互斥锁吗?如果提供了API,该怎么办?
compareAndWait
Run Code Online (Sandbox Code Playgroud)
和
setAndNotify
Run Code Online (Sandbox Code Playgroud)
相反,将CAS动作与线程调度/去调度相结合?这会有一些好处:
即将进入等待状态的线程不会妨碍通知线程的进度;
在被允许检查等待状况之前,他们也不必等待对方;
在通知方面,任何数量的生产者线程都可以同时进行.
提供这样的API是否存在根本的,不可逾越的障碍?
我是Kotlin协同程序的新手,有一点我没想到的是,协同程序如何知道在进行网络调用时何时屈服于其他人.
如果我理解正确的话,协同程序会先发制人地工作,这意味着当它执行一些耗时的任务(通常是I/O操作)时,它知道何时屈服于其他协同程序.
例如,假设我们想绘制一些将显示来自远程服务器的数据的UI,并且我们只有一个线程来安排我们的协同程序.我们可以启动一个协程来进行REST API调用以获取数据,同时让另一个协同程序绘制UI的其余部分,它们不依赖于数据.但是,由于我们只有一个线程,因此一次只能运行一个协程.除非用于获取数据的协程在等待数据到达时抢先获取,否则两个协同程序将按顺序执行.
据我所知,Kotlin的协程实现并没有修补任何现有的JVM实现或JDK网络库.因此,如果协程正在调用REST API,它应该像使用Java线程一样阻止.我这样说是因为我在python中看起来有类似的概念,叫做绿色线程.为了使它能够与python的内置网络库一起工作,必须首先对网络库进行"猴子修补".对我而言,这是有道理的,因为只有网络库本身知道何时屈服.
那么,任何人都可以解释Kotlin协程如何知道何时调用阻塞Java网络API?或者如果没有,那么它是否意味着上面例子中提到的任务无法同时执行给出单个线程?
谢谢!
假设我们有以下挂起功能:
suspend fun doSomething(): List<MyClass> { ... }
Run Code Online (Sandbox Code Playgroud)
如果我想在我现有的一个Java类中调用此函数(我现在无法将其转换为Kotlin)并获得其返回值,我必须提供一个Continuation<? super List<MyClass>>参数(显然).
我的问题是,我该如何实施一个.特别是它的getContext吸气剂.
我正在尝试调用API,当我的变量准备就绪时,分别更新UI组件.
这是我的网络单身人士正在启动协程:
object MapNetwork {
fun getRoute(request: RoutesRequest,
success: ((response: RoutesResponse) -> Unit)?,
fail: ((throwable: Throwable) -> Unit)? = null) {
val call = ApiClient.getInterface().getRoute(request.getURL())
GlobalScope.launch(Dispatchers.Default, CoroutineStart.DEFAULT, null, {
try {
success?.invoke(call.await())
} catch (t: Throwable) {
fail?.invoke(t)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所说的:
network.getRoute(request,
success = {
// Make Some UI updates
},
fail = {
// handle the exception
})
Run Code Online (Sandbox Code Playgroud)
我得到的异常表示无法从UI线程以外的任何线程更新UI:
com.google.maps.api.android.lib6.common.apiexception.c: Not on the main thread
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个解决方案,但是从Kotlin 1.3开始resume,Continuation<T>课堂上已经"弃用"了