
c – 如何正确使用std:vector的erase()函数?
在std:vector上使用erase()函数时,我遇到了一个奇怪的问题.我使用以下代码:
int count = 0;
for (int itr=0; itr<b.size(); ++itr) {
if (b[count].notEmpty = false) {
b.erase(b.begin()+count);
--count;
}
++count;
}
但是,由于某些原因,实际上没有任何元素从b中删除. b在其他地方宣布如下:
vector<block_data> b;
其中block_data是一个结构,并包含布尔值notEmpty.某些b的元素在代码中较早地正确分配了notEmpty = false,因此我不确定它们为什么不被删除.是语法错误还是其他错误?
解决方法
使用擦除没有任何问题.问题是if条件中的赋值:
if(b[count].notEmpty = false)
这会将b [count] .notEmpty设置为false,然后返回false.这将导致if语句的内部机构永远不会运行.
将其更改为
if(b[count].notEmpty == false)
或事件
if(!b[count].notEmpty)
你应该好好去.

javascript – 如何正确使用$.deferred与不可观察的函数?
比方说,我有两个函数,里面有随机代码,也基于用户的系统(慢,中,或快),没有办法告诉两个函数需要多长时间才能完成,所以使用setTimeout仅在function1完成后尝试触发function2时不实用.
你怎么能使用jQuery.deferred使function2只在function1之后触发,无论时间要求是什么,并且考虑到这两个函数都是100%非jQuery函数,里面没有jQuery代码,因此jQuery完全无法观察到?最重要的是,这些函数可能包括像.css()这样的jQuery方法,这些方法没有时间关联,并且可以在旧计算机上运行得更慢.
如果我这样调用它,我如何确保function2没有与function1同时执行:
function1(); function2();
使用$.deferred?除了那些关于$.deferred之外的任何其他答案也欢迎!
3月20日新增:
如果function1()是一个lambda函数,如果根据用户输入,该函数可能有也可能没有异步调用,并且无法判断该函数将执行多少操作,该怎么办?它是一个函数,你不知道接下来会发生什么,但无论如何,你仍然希望function2只有在完成lambda函数(function1)的所有操作后才能执行,无论如何只要异步方面完成,它就需要很长时间.怎么能实现这一目标?
3月22日新增:
所以我想我要问的唯一方法就是将匿名函数作为回调传递给异步函数,这些函数在完成后执行回调,或者创建事件监听器,在事件最终触发时执行你想要的操作.
实际上没有任何方法可以在两个单独的行上执行异步调用并按顺序触发它们,而无需在包含所述函数的框架内手动构造机制(事件处理程序)来处理其操作的实际执行.
这些类型的机制的一个很好的例子是jQuery的.queue()方法和$.Defferred对象.
下面的答案以及在.queue()和使用$.Deferred上阅读jQuery的API有助于澄清这一点.
Tgr在下面给出了一个很好的例子,说明如何使用jQuery的$.Deferred对象创建自定义可链接函数,而自定义函数本身并不一定要在其中包含任何jQuery代码,这正是我想要的.
最佳答案
function first(deferred) {
// do stuff
deferred.resolve();
}
function second() {
// do stuff
}
$.Deferred(first).then(second);
但正如Tomalak指出的那样,这是不必要的,除非你先做一些非常棘手的事情(比如利用网络工作者).
更新:
基本思想是,无论何时执行非直接的操作,都会创建一个Deferred对象,并返回该对象. (jQuery的AJAX调用已经这样做了.)然后你可以使用Deferred.then来延迟后续操作.
function first() {
var deferred = $.Deferred();
var callback = function() {
deferred.resolve();
}
// do immediate stuff
someAsyncoperation(callback);
return deferred.promise(); // turns the Deferred into a Promise,which
// means that resolve() will not be accessible
}
function second() {
// do stuff
}
first().then(second); // or: $.when(first).then(second)
如果second也是异步操作,则可以使用$.when的合并功能:
function second() {
var anotherDeferred = $.Deferred();
// do stuff with anotherDeferred
return anotherDeferred.promise();
}
$.when(first(),second()).then(third); // third will run at the moment when
// both first and second are done

Java中如何正确使用对象方法wait和notify

如何正确使用Java中的对象方法:wait和notify
在Java中,wait和notify是用来实现多线程间的协作的重要方法。正确地使用这两个方法可以避免竞争条件和死锁等多线程问题,确保程序的安全性和效率。本文将介绍如何正确使用Java中的对象方法wait和notify,并提供具体的代码示例。
一、wait和notify的基本原理和功能
在理解如何正确使用wait和notify之前,需要先了解它们的基本原理和功能。
立即学习“Java免费学习笔记(深入)”;
- wait:使当前线程进入等待状态,直到其他线程通过notify或notifyAll方法唤醒它。使用wait方法可以有效地释放对象的锁,并阻塞当前线程,使其暂停执行。
- notify:唤醒在该对象上等待的一个线程。如果有多个线程等待,notify只会随机唤醒一个线程,具体唤醒哪个线程是不确定的。
- notifyAll:唤醒在该对象上等待的所有线程。使用notifyAll方法可以唤醒所有等待的线程,但是具体唤醒哪一个线程取决于线程调度器。
二、正确使用wait和notify的步骤
正确使用wait和notify需要按照以下步骤进行:
- 加锁:在使用wait和notify时,必须先获得对象的锁。可以使用synchronized关键字来加锁,或者使用Lock对象进行加锁。
- 调用wait方法:在进入临界区之前,调用锁对象的wait方法,使当前线程进入等待状态。
- 条件判断:在进入临界区之前,应该先对共享资源的条件进行检查。如果不满足条件,应该继续等待,直到条件满足。
- 释放锁:在调用wait方法后,当前线程会释放对象的锁,允许其他线程进入临界区操作共享资源。
- 调用notify或notifyAll方法:在满足条件的情况下,可以调用锁对象的notify或notifyAll方法,唤醒等待的线程。
- 重新加锁:被唤醒的线程会重新获得对象的锁,并继续竞争执行。
三、具体代码示例
下面的代码示例展示了如何正确使用wait和notify实现两个线程之间的协作。其中一个线程负责待唤醒,另一个线程负责唤醒。
public class WaitNotifyExample {
private static final Object lock = new Object();
private static boolean isReady = false;
public static void main(String[] args) {
Thread waitingThread = new Thread(() -> {
synchronized (lock) {
while (!isReady) {
try {
System.out.println("等待中...");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("等待结束!");
}
});
Thread notifyingThread = new Thread(() -> {
synchronized (lock) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("唤醒等待的线程...");
isReady = true;
lock.notify();
}
});
waitingThread.start();
notifyingThread.start();
}
}
登录后复制
运行上述代码,可以看到等待线程会进入等待状态,并在被唤醒后继续执行。
在这个示例中,我们使用了一个共享的boolean变量isReady来表示等待的条件。等待线程在进入临界区之前会对isReady进行检查,如果条件不满足,则调用wait方法进入等待状态。唤醒线程在满足条件之后会改变isReady的值,并调用notify方法唤醒等待的线程。
需要注意的是,在使用wait和notify时,必须确保线程获取的是同一个对象的锁。否则,线程无法正确地进入等待状态或被唤醒。
总结
使用wait和notify方法可以实现多线程之间的协作,确保程序的安全性和效率。在使用这两个方法时,需要按照正确的步骤进行,包括加锁、调用wait方法、检查条件、释放锁、调用notify方法等。通过合理地使用wait和notify方法,我们可以避免多线程问题,提高程序的可靠性和可维护性。
以上就是Java中如何正确使用对象方法wait和notify的详细内容,更多请关注php中文网其它相关文章!

jQuery:如何正确使用.stop()函数?
在本页面:
http://www.arvag.net/old/smsbox.de/
当您将鼠标悬停在“informationen”和“Überins”上时,它会显示一个子菜单.当你移开鼠标时,它会隐藏.通常情况下,我对每个单独悬停的jQuery排队都有问题,然后它继续为所有这些悬停设置动画.我试图实现stop(),但我无法让它正常工作.
这是我正在使用的代码:
<script type="text/javascript">
//<![CDATA[
$(function(){
$('#nav_menu > .center > ul > li').hover(function() {
$(this).stop(true,true).children('ul').slidetoggle('slow');
}).click(function(){
return false;
});
});
//]]>
</script>
谢谢!
解决方法
你需要在两个方向都使用.stop()来停止队列,否则鼠标的鼠标中心部分会一直排队它的动画.此外,既然你正在切换,你可以像这样缩短它:
$('#nav_menu > .center > ul > li').hover(function() {
$(this).children('ul').stop(true,true).slidetoggle('slow');
}).click(function(){
return false;
});
你需要ul元素上的.stop(),因为那就是动画.试试这个,你会发现它有点笨拙,因为它正在重置动画而不是排队.另一种方法是使用:visible
和:hidden
选择器来阻止队列…我更喜欢这种效果,但取决于你:)
$('#nav_menu > .center > ul > li').hover(function() {
$(this).children('ul:hidden').slideDown('slow');
},function() {
$(this).children('ul:visible').slideUp('slow');
}).click(function(){
return false;
});
今天关于如何正确使用IIFE在具有正确的var数据的数组中分配函数?的讲解已经结束,谢谢您的阅读,如果想了解更多关于c – 如何正确使用std:vector的erase()函数?、javascript – 如何正确使用$.deferred与不可观察的函数?、Java中如何正确使用对象方法wait和notify、jQuery:如何正确使用.stop()函数?的相关知识,请在本站搜索。