给出以下Java代码:
public class Test {
static private class MyThread extends Thread {
private boolean mustShutdown = false;
@Override
public synchronized void run() {
// loop and do nothing, just wait until we must shut down
while (!mustShutdown) {
try {
wait();
} catch (InterruptedException e) {
System.out.println("Exception on wait()");
}
}
}
public synchronized void shutdown() throws InterruptedException {
// set flag for termination, notify the thread and wait for it to die
mustShutdown = true;
notify();
join(); // lock …Run Code Online (Sandbox Code Playgroud) 我必须在我的Android应用程序中等待几秒钟,我想在此期间显示进度条,我该怎么做?
我试过这个代码:
public boolean WaitTask() {
pDialog = ProgressDialog.show(context,null, "Lädt..",true);
new Thread() {
public void run() {
try{
// just doing some long operation
sleep(2000);
} catch (Exception e) { }
pDialog.dismiss();
}
}.start();
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是进度条立即关闭而不等待两秒钟.我的问题在哪里?
进度条应该类似于Android开发者在此站点中显示的活动圈.
更新 AsyncTask
private class WaitTime extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mDialog.show();
}
protected void onPostExecute() {
mDialog.dismiss();
}
@Override
protected void onCancelled() {
mDialog.dismiss();
super.onCancelled();
}
@Override
protected Void doInBackground(Void... params) {
long …Run Code Online (Sandbox Code Playgroud) 我是C#的新手并且正在使用Task.我试图运行这个应用程序但我的应用程序每次都挂起.当我添加时task.wait(),它会一直等待,永远不会返回.任何帮助深表感谢.编辑:我想异步调用DownloadString.当我按照"Austin Salonen"的建议执行task.Start()时,我没有得到位置的地址,而是从returnVal获取位置字符串中的默认值.这意味着在任务完成之前,位置得到了值.如何确保在任务完成后只有位置被指定returnVal.
public class ReverseGeoCoding
{
static string baseUri = "http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false";
string location = "default";
static string returnVal = "defaultRet";
string latitude = "51.962146";
string longitude = "7.602304";
public string getLocation()
{
Task task = new Task(() => RetrieveFormatedAddress(latitude, longitude));
//var result = Task.Factory.StartNew(RetrieveFormatedAddress("51.962146", "7.602304"));
task.Wait();
//RetrieveFormatedAddress("51.962146", "7.602304");
location = returnVal;
return location;
}
public static void RetrieveFormatedAddress(string lat, string lng)
{
string requestUri = string.Format(baseUri, lat, lng);
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted …Run Code Online (Sandbox Code Playgroud) 基本上我试图使用JavaFX做一个简短的效果.我有一个心脏的形状(从两个圆圈和一个多边形加起来),我可以使用double值改变大小p."标准尺寸"将是p = 1.0;.
我试图给心脏增加一个泵效应.我有方法pumpOnce():
public void pumpOnce(){
p = p + 1;
initHeart();
//Here goes what ever it takes to make stuff working!!
p = p - 1;
initHeart();
}
Run Code Online (Sandbox Code Playgroud)
initHeart()吸取内心的基础p.
我发现Thread.sleep();由于JavaFX中的线程原理,或类似的方法不起作用.
但是我可以用什么呢?
我需要创建一个简单的队列管理器来将数字从发件人传递给消费者.RabbitMQ提供的Hello World教程几乎覆盖了70%.
但我需要将队列更改为永远不会等待传入的消息.或者在一定数量的消息后停止等待.我阅读并尝试了其他帖子中的一些解决方案,但它不起作用.
rabbitmq AMQP :: consume() - 未定义的方法.还有另一种方法,wait_frame但它受到保护.
和其他帖子是python,我不明白.
<?php
require_once __DIR__ . '/vendor/autoload.php';
require 'config.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
function recieveQueue($queueName){
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// try{
// $connection->wait_frame(10);
// }catch(AMQPConnectionException $e){
// echo "asdasd";
// }
$channel = $connection->channel();
$channel->queue_declare($queueName, false, false, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
// $tag = uniqid() . microtime(true);
// $queue->consume($callback, $flags, …Run Code Online (Sandbox Code Playgroud) 我试图让每个声明中的div淡入/淡出.问题是在淡入/淡出完成之前调用下一个项目.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script>
<div id='one'>one</div>
<div id='two'>two</div>
<div id='three'>three</div>
<script>
$.each([ "one", "two", "three"], function() {
console.log( 'start - ' + this );
animate( this );
console.log( 'end - ' + this );
});
function animate( id )
{
box = '#' + id;
$(box).fadeOut( 500, function( )
{
console.log('showing - ' + id);
$(box).fadeIn( 500 );
$(box).css('backgroundColor','white');
});
}
</script>
Run Code Online (Sandbox Code Playgroud)
控制台节目 -
start - one
end - one
start - two
end - two
start - three
end …Run Code Online (Sandbox Code Playgroud) 在初始化表单(主窗体)时,它调用另一个窗体来获取一堆启动输入,然后传输大量信息:
Form3 getup = new Form3();
getup.Show();
example = getup.example;
Run Code Online (Sandbox Code Playgroud)
但是,我需要等待这个新的表单信息完成.
Form3 getup = new Form3();
getup.Show();
waitfordone();
example = getup.example;
Run Code Online (Sandbox Code Playgroud)
ATM,我尝试过使用while语句:
Form3 getup = new Form3();
getup.Show();
While(getup.visible=true)Console.WriteLine("waiting");
example = getup.example;
Run Code Online (Sandbox Code Playgroud)
但是这会导致挂起...也就是说,它会运行,然后冻结.我怀疑这是因为while循环正在吃掉所有的处理.所以,我试着创建一个新线程
Form3 getup = new Form3();
Thread t = new Thread(getup.Show());
t.start();
While(getup.visible=false)Console.WriteLine("waiting"); // takes a little bit to open
While(getup.visible=true)Console.WriteLine("waiting"); //waits for close
example = getup.example;
Run Code Online (Sandbox Code Playgroud)
但这也导致它挂起.也许出于同样的原因.我已经研究过autoresetevents.
我试过了:
AutoResetEvent invisible = new AutoResetEvent(false);
Form3 getup = new Form3();
void setup_invisible(object sender, EventArgs e)
{
if (getup.Visible == …Run Code Online (Sandbox Code Playgroud) 出于好奇,当Java实现wait()和notify()方法时,它们真的只是使用锁吗?即,wait()获取互斥锁,notify()释放互斥锁,notifyAll()释放所有互斥锁(当然在同一个对象中)?
除了比使用锁更简单之外,使用wait()和notify()还有其他优点吗?
[编辑]我意识到在Brian的评论之后我对此感到困惑:
等待没有锁定,它释放锁定并将其传递给正在等待互斥锁的同步语句的其他人,然后等待有锁定并通知的其他人通知,这会将锁定传回原始状态调用等待的线程.我认为这就是你感到困惑的地方. - 布赖恩17分钟前
我在java.lang.Object中使用wait()的定时版本,并观察到它在两种不同的场景中的行为不同.
场景1:在Thread中使用run()的默认定义
public static void main (String[] args) throws InterruptedException {
Thread t = new Thread();
t.start();
System.out.print("X");
synchronized(t) { t.wait(10000);}
System.out.print("Y");
}
Run Code Online (Sandbox Code Playgroud)
关于scenario1的问题:我遇到了X和Y之间的延迟.这是因为我从main调用wait()(即使在t上)因此正在使用主线程的调用堆栈,而不是第二个线程?
场景2:动态 子类化线程以覆盖run()以打印内容.
public static void main (String[] args) throws InterruptedException {
Thread t = new Thread() {public void run()
{System.out.print("I am the second thread.");}};
t.start();
System.out.print("X");
synchronized(t) { t.wait(10000);}
System.out.print("Y");
}
Run Code Online (Sandbox Code Playgroud)
关于场景2的问题:我没有遇到任何延迟!是什么改变只是因为我已经覆盖了run()?现在,每次我运行该程序时,它立即打印出"XI am the second thread.Y",无论如何都没有任何延迟!wait()的效果在哪里消失了?
我最近开始随意使用tkwait并注意到某些功能仅在特殊条件下才起作用。例如:
import tkinter as tk
def w(seconds):
dummy = tk.Toplevel(root)
dummy.title(seconds)
dummy.after(seconds*1000, lambda x=dummy: x.destroy())
dummy.wait_window(dummy)
print(seconds)
root = tk.Tk()
for i in [5,2,10]:
w(i)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
上面的代码工作得很好并且符合预期:
但在事件驱动的环境中,这些tkwait调用会变得很棘手。该文档指出引用:
如果事件处理程序再次调用 tkwait,则对 tkwait 的嵌套调用必须在外部调用完成之前完成。
>>5 >>2 >>10您将得到的不是输出>>10 >>2 >>5,因为嵌套调用会阻塞内部调用,而外部调用会阻塞内部调用。我怀疑嵌套事件循环或等效的主循环在等待时以正常方式处理事件。
我使用此功能是否做错了什么?因为如果您仔细想想,几乎所有 tkinter 对话框窗口都在使用此功能,而我以前从未读过此行为。
事件驱动的示例可能是:
import tkinter as tk
def w(seconds):
dummy = tk.Toplevel(root)
dummy.title(seconds)
dummy.after(seconds*1000, lambda x=dummy: x.destroy())
dummy.wait_window(dummy)
print(seconds)
root …Run Code Online (Sandbox Code Playgroud) wait ×10
java ×3
c# ×2
amqp ×1
android ×1
concurrency ×1
each ×1
event-driven ×1
forms ×1
google-api ×1
javafx ×1
join ×1
jquery ×1
locking ×1
notify ×1
php ×1
php-amqplib ×1
progress-bar ×1
python ×1
rabbitmq ×1
synchronized ×1
task ×1
tcl ×1
thread-sleep ×1
tkinter ×1