我正在研究Java Swing应用程序.我有一个按钮,其动作在数据库上运行查询,然后绘制结果.这些命令是从"运行"按钮上的侦听器执行的.据我了解,这意味着此时运行的线程来自EventQueue.
给定某些输入,我需要暂停处理并等待用户点击绘图区域.我正在努力寻找一种方法来做到这一点.我看了一遍,但我似乎无法找到一个有效的解决方案.我试图创建一个等待用户输入的新线程(我在这个线程上调用join).问题是这使得前一个线程(来自EventQueue)等待.出于某种原因,鼠标单击不会导致中断,因此永远不会捕获鼠标单击.
任何帮助将非常感激.提前致谢.
我目前正在编写类似于brick breaker的游戏,需要知道如何使我的程序等待调用特定函数.
我需要暂停程序,直到按钮之间做出决定.例如,游戏启动,并且用户可以选择他想要在他的游戏中使用哪种颜色.因此,游戏暂停直到他的选择已经完成并且他很高兴然后该程序需要恢复到不同的阶段.
我有一个java多线程问题.我有两个线程访问一个方法A(),它在内部有一个for循环,在循环中调用一个方法B().应使用线程名锁定锁定方法A,并且应将方法B锁定在方法B操作的对象ID上.检查以下代码.
Currrent代码
private static final ConcurrentHashMap<Object, Object> LOCKS = new ConcurrentHashMap<Object, Object>();
private void methodA(){
LOCKS.putIfAbsent(Thread.currentThread().getName(), new Object()))
synchronized (LOCKS.putIfAbsent(Thread.currentThread().getName(), new Object())) {
for(loop through all objects) {
methodB(Object1);
}
}
}
private void methodB(Object1 object1) {
LOCKS.putIfAbsent(object1.getObjectId(), new Object()))
synchronized(LOCKS.putIfAbsent(object1.getObjectId(), new Object())){
//<Work on object1>
}
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了上面的代码,以确保2个不同的线程应该能够并行访问methodA(),但不应该在methodB()中一次使用同一个Object1(由methodA()调用).即; 虽然我希望线程A和线程B同时访问methodA(),然后循环遍历'for'循环中的所有对象并通过调用methodB()对每个对象进行操作,我不希望线程A和B到一次作用于SAME对象实例.因此上面的代码基于对象实例ID锁定methodB().
需要改进.
在上面的代码中,如果线程A和线程B来到methodB()并发现它们都想要在同一个对象'obj1'上工作,那么现在使用上面的代码,线程A将等待,或者线程B将等待另一个一个完成取决于谁到达并锁定methodB()首先.
但想象一下,线程A首先获得锁定并执行methodB()需要9个小时才能完成处理'obj1'.在这种情况下,线程B需要等待整整9个小时才有机会执行methodB(),从而处理'obj1'.
我不希望这种情况发生.线程B,一旦发现方法B()被线程A锁定在'obj1'的名称中,就应该继续(稍后再回到obj1)来尝试锁定和处理其他对象.即; 它应该尝试处理'for'循环中的其他对象,如对象列表中的obj1,obj2等.
任何解决这个"无需等待锁定"问题的输入将不胜感激.
非常感谢您的帮助.
一些澄清,以改善答案.
以下代码:
B() {
pid_t pid;
if ((pid=fork())!= 0)
waitpid(pid,NULL,0);
printf("2 ");
if (fork() == 0)
{ printf("3 "); exit(0); }
printf("5 ");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
可能有一个输出:我不知道哪一个是正确的输出.
232553
235325
232355
235253
252533
Run Code Online (Sandbox Code Playgroud)
这两行意味着如果pid是父母,那么等待什么?
if ((pid=fork())!= 0)
waitpid(pid,NULL,0);
Run Code Online (Sandbox Code Playgroud)
那么如果是子进程(fork = 0),那么打印3 ..正确吗?
if (fork() == 0)
{ printf("3 "); exit(0); }
Run Code Online (Sandbox Code Playgroud) wait()和notify()不是静态的,因此编译器应该给出必须从静态上下文调用wait的错误.
public class Rolls {
public static void main(String args[]) {
synchronized(args) {
try {
wait();
} catch(InterruptedException e)
{ System.out.println(e); }
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是以下代码编译并正常运行.为什么编译器不会在这里给出错误?或者,为什么编译器会在先前的代码中给出必须从静态上下文调用wait的错误?
public class World implements Runnable {
public synchronized void run() {
if(Thread.currentThread().getName().equals("F")) {
try {
System.out.println("waiting");
wait();
System.out.println("done");
} catch(InterruptedException e)
{ System.out.println(e); }
}
else {
System.out.println("other");
notify();
System.out.println("notified");
}
}
public static void main(String []args){
System.out.println("Hello World");
World w = new World();
Thread t1 = new Thread(w, "F");
Thread t2 = new …Run Code Online (Sandbox Code Playgroud) 我正在创建一个我需要运行的程序,然后等待10分钟再继续
procedure firstTimeRun(const document: IHTMLDocument2);
var
fieldValue : string;
StartTime : Dword;
begin
StartTime := GetTickCount();
WebFormSetFieldValue(document, 0, 'Username', '*******');
WebFormSetFieldValue(document, 0, 'Password', '*******');
WebFormSubmit(document, 0);
if (GetTickCount() >= StartTime+ 600000) then
begin
SecondRun();
end;
end;
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我到达if语句时,它会检查它是不是真的并继续我如何让它保持并等到语句为真?
我有一个相当简单的问题,我没有在任何地方看到适当的答
我正在使用java.awt设计一个Java applet.我想要做的是让Java在执行简单图形动画的方法中执行代码的不同部分之间等待几秒钟.
所以它是这样的:
runAnimation() {
// draw red shapes
// wait 2 seconds so the shapes remain visible
// set color of shapes to green and repaint
}
Run Code Online (Sandbox Code Playgroud)
如其他地方所建议的,如果我使用类似的东西
try {
// do first task
Thread.sleep(2000);
// do second task
} catch (InterruptedException e) {
}
Run Code Online (Sandbox Code Playgroud)
程序只显示等待2秒后第二个任务的结果,即我从未看到红色形状.我希望看到红色形状两秒钟,然后将它们设置为蓝色等等.
我正在用Java做一个控制台应用程序.我有一种方法,我需要等待一秒钟,然后继续我的方法.这只是一个简单的方法,因此它意味着没有涉及任何线程.我能做什么?
我的程序看起来像这样:
它必须等待1秒!
我有一段下面的代码,其中等待时间在别处计算.在某些情况下,等待时间值为0,我注意到当等待时间为零时,线程似乎永远等待.我在Javadoc中找不到任何特定于此案例的内容.我可以为此添加一个检查,但我只需要了解为什么会发生这种情况并且允许发送0等待时间
synchronized (monitor) {
try {
monitor.wait(wait);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 因此我知道在Qt中,您可以将信号发生后想要的所有内容放到插槽中,但是稍后再编辑代码时就可以了。这可能需要大量的重组,并且可能使事情复杂化。
有没有更简单的方法来保存程序,直到在Qt中发出信号,例如:
downloadImage();
Qt::waitForSignal(downloadImageFinished());
editImage();
Run Code Online (Sandbox Code Playgroud)
也; 为什么这样的东西不起作用:
// bool isFinished();
downloadImage(); // When done, isFinished() returns true;
while (!isFinished()) {}
editImage();
Run Code Online (Sandbox Code Playgroud)
?谢谢。