你能解释什么时候调用java.lang.Thread.interrupt()吗?
我们都知道,为了调用Object.wait() ,这个调用必须放在synchronized块中,否则抛出IllegalMonitorStateException异常。 但是这个限制的理由是什么呢? 我知道wait()释放监视器,但为什么我们需要通过使特定的块同步来显式获取监视器,然后通过调用wait()释放监视器? 如果可以在同步块之外调用wait() ,保留它的语义,挂起调用者线程有什么潜在的危害?
我是新来的Java图形和线程,我试图做一个游戏(具体来说,庞)。 这个想法是,两个人可以在同一个键盘上玩(即有两个通过不同的键控制的桨)。 目前,双方球员不能同时移动他们的桨。 有没有解决这个问题? 是单独的线程的答案? 如果可能,我希望桨能够同时移动(至少看起来)。 更新:好像使用Set<Integer>来存储按下的键是最好的选择。 我已经这样做了(而且它的工作原理),但我想知道是否有任何代码不在事件调度线程(EDT),如果我需要使用SwingUtilities.invokeLater(); 。 这是必要的代码: private Set<Integer> keysDown = Collections.synchronizedSet(new HashSet<Integer>()); public void keyPressed(KeyEvent e) { keysDown.add(e.getKeyCode()); } public void keyReleased(KeyEvent e) { keysDown.remove(e.getKeyCode()); } public void updatePaddlePositions() { if (keysDown.contains(KeyEvent.VK_W)) paddleOne.move(-PADDLE_MOVE_INCREMENT); if (keysDown.contains(KeyEvent.VK_S)) paddleOne.move(PADDLE_MOVE_INCREMENT); if (keysDown.contains(KeyEvent.VK_UP)) paddleTwo.move(-PADDLE_MOVE_INCREMENT); if (keysDown.contains(KeyEvent.VK_DOWN)) paddleTwo.move(PADDLE_MOVE_INCREMENT); try { Thread.sleep(DELAY); } catch (InterruptedException e) { System.out.println("You […]
如何获得线程返回的值'foo' ? from threading import Thread def foo(bar): print 'hello {}'.format(bar) return 'foo' thread = Thread(target=foo, args=('world!',)) thread.start() ret = thread.join() print ret 上面显示的一个显而易见的方法是返回None 。
C ++ 0x是否会出现没有信号量的情况? 关于使用信号量,Stack Overflow已经有一些问题了。 我一直使用它们(posix信号量)让一个线程在另一个线程中等待某个事件: void thread0(…) { doSomething0(); event1.wait(); … } void thread1(…) { doSomething1(); event1.post(); … } 如果我用互斥体做到这一点: void thread0(…) { doSomething0(); event1.lock(); event1.unlock(); … } void thread1(…) { event1.lock(); doSomethingth1(); event1.unlock(); … } 问题:这是丑陋的,并不能保证thread1首先锁定互斥锁(假设同一个线程应该锁定和解锁互斥锁,在thread0和thread1开始之前,也不能锁定event1)。 所以既然boost还没有信号量,那么实现上面的最简单的方法是什么?
我经常看到它提到了Thread.Sleep(); 不应该使用,但我不明白为什么这样。 如果Thread.Sleep(); 会造成麻烦,有没有其他的解决方案可以保证安全? 例如。 while(true) { doSomework(); i++; Thread.Sleep(5000); } 另一个是: while (true) { string[] images = Directory.GetFiles(@"C:\Dir", "*.png"); foreach (string image in images) { this.Invoke(() => this.Enabled = true); pictureBox1.Image = new Bitmap(image); Thread.Sleep(1000); } }
我正在寻找一个好的想法来实现一个通用的方式来执行代码的单行(或匿名委托)超时。 TemperamentalClass tc = new TemperamentalClass(); tc.DoSomething(); // normally runs in 30 sec. Want to error at 1 min 我正在寻找一个解决方案,可以优雅地在我的代码与气质代码交互(我不能改变)的许多地方实现。 另外,如果可能的话,我想让有问题的“超时”代码停止执行。
在C#4.0中,我们在System.Threading.Tasks命名空间中有Task 。 Thread和Task之间真正的区别是什么? 我做了一些示例程序(来自MSDN的帮助)为我自己学习 Parallel.Invoke Parallel.For Parallel.ForEach 但是这个想法还不是很清楚,所以有很多疑问。 我最初在Stackoverflow中搜索类似的问题,但可能与这个问题标题我不能得到相同的。 如果有人知道前面发布的同类问题,请给出链接的参考。
我想在两行代码之间停顿一下,让我解释一下: – >用户点击一个按钮(实际上是一个卡),我通过改变这个按钮的背景来显示它: thisbutton.setBackgroundResource(R.drawable.icon); – >让我们说1秒后,我需要通过改回其背景回到按钮的前一个状态: thisbutton.setBackgroundResource(R.drawable.defaultcard); – >我试着暂停这两行代码之间的线程: try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } 但是,这是行不通的。 也许这是过程,而不是我需要暂停的线程? 我也试过(但不起作用): new Reminder(5); 有了这个: public class Reminder { Timer timer; public Reminder(int seconds) { timer = new Timer(); timer.schedule(new RemindTask(), seconds*1000); } class RemindTask extends TimerTask { public void […]
我是WPF的初学者,在我的应用程序中,我需要执行一系列的初始化步骤,这些需要7-8秒才能完成,在这个过程中,我的UI变得没有反应。 为了解决这个问题,我在一个单独的线程中执行初始化: public void Initialization() { Thread initThread = new Thread(new ThreadStart(InitializationThread)); initThread.Start(); } public void InitializationThread() { outputMessage("Initializing…"); //DO INITIALIZATION outputMessage("Initialization Complete"); } 我已经阅读了关于BackgroundWorker的一些文章,以及它如何让我保持我的应用程序响应,而不必写一个线程来执行冗长的任务,但我没有尝试实现它的任何成功,谁能告诉我如何使用BackgroundWorker做到这一点? 谢谢,Eamonn