锁定老帖子 主题:关于在Java游戏中实现暂停的讨论
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-22
我就简单说一句.
先别搞那个多线程,用一个线程先把程序写出来. 然后慢慢改成多线程的,啥问题都可以解决了. |
|
返回顶楼 | |
发表时间:2009-05-22
看清楚你的API呀, 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。 意思就是如果正在SLEEP(),就先把SLEEP()干掉,而不是干掉thread。 |
|
返回顶楼 | |
发表时间:2009-05-22
wjyjimy 写道 看清楚你的API呀, 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。 意思就是如果正在SLEEP(),就先把SLEEP()干掉,而不是干掉thread。 无语了,interrupt()函数根本就不是中断线程的,它只是设置线程的一个中断变量,由程序来决定是否使用这个变量,但是如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法时,中断变量被置位,则这些方法会抛出InterruptedException这个异常。 这个函数只是通知一个线程结束而已,如下代码 private Thread eventHandler = new Thread(eventRunnable); private Runnable eventRunnable = new TrafficLightRunnable(); class TrafficLightRunnable implements Runnable { public void run() { while (true) { // Do something // for example repaint the panel tl.repaint(); } } } 你即使调用了eventHandler.interrupt();它也不会停止。 |
|
返回顶楼 | |
发表时间:2009-05-22
liujunsong 写道 我就简单说一句.
先别搞那个多线程,用一个线程先把程序写出来. 然后慢慢改成多线程的,啥问题都可以解决了. 就有两个线程而已,一个用来接收用户输入,一个用来更新画面,我觉得这样至少两个线程吧。 |
|
返回顶楼 | |
发表时间:2009-05-22
insiku 写道 唉 基础不是一般般的差
大哥,不要光感叹,基础也是慢慢练出来的啊。 |
|
返回顶楼 | |
发表时间:2009-05-22
我实在很无语,,你动手试试下面的代码输出了什么,然后把t.interrupt();注释掉,再看看输出的是什么,我不多说了,可能你想得太多了,不是有句话叫做“什么都别想------直接去做”吗?
public class thread6 { public static void main(String[] args) { compute t=new compute(); t.start(); t.interrupt(); } } ///创建一个线程类,在这个类中,通过休眠,让线程运行输出不同的结果 class compute extends Thread { int i=0; public void run() { System.out.println("在工作中,不要打扰"); try { sleep(10000000); } catch(Exception e){System.out.println("哦,电话来了");} } } |
|
返回顶楼 | |
发表时间:2009-05-22
wjyjimy 写道 我实在很无语,,你动手试试下面的代码输出了什么,然后把t.interrupt();注释掉,再看看输出的是什么,我不多说了,可能你想得太多了,不是有句话叫做“什么都别想------直接去做”吗?
public class thread6 { public static void main(String[] args) { compute t=new compute(); t.start(); t.interrupt(); } } ///创建一个线程类,在这个类中,通过休眠,让线程运行输出不同的结果 class compute extends Thread { int i=0; public void run() { System.out.println("在工作中,不要打扰"); try { sleep(10000000); } catch(Exception e){System.out.println("哦,电话来了");} } } 这种方式是可行的,但是这并不是interrupt的用途,就像API中所说的,它只是通知相应的线程而已。同时会引起sleep()函数出现异常,在这种情况下就变成用异常来控制程序了。 |
|
返回顶楼 | |
发表时间:2009-05-22
javaeye里怎么不加个“最让人吐血的楼主”评选栏目呢,不多说了,上面代码改为
package thread睡眠与唤醒; /** * * @author Administrator */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here compute t=new compute(); t.start(); t.interrupt(); } } ///创建一个线程类,在这个类中,通过休眠,让线程运行输出不同的结果 class compute extends Thread { int i=0; public void run() { System.out.println("在工作中,不要打扰"); try { sleep(1000000); } catch(Exception e){} System.out.println("哦,电话来了"); } } |
|
返回顶楼 | |
发表时间:2009-05-23
使用信号量来实现暂停的方式
画面更新进程中 class TrafficLightRunnable implements Runnable { public void run() { try { while (true) { if (mode == PAUSE) { // just for wait gate.acquire(); // release it gate.release(); } tl.updatePanel(); Thread.sleep(1000); } } catch (InterruptedException ex) { System.out.println(ex.getMessage()); } } } 在事件响应方法中 //信号量 private Semaphore gate = new Semaphore(1); public void actionPerformed(ActionEvent e) { if (btn.getText().equals("Pause")) { btn.setText("Start"); try { gate.acquire(); mode = PAUSE; } catch (InterruptedException e) { } } else { btn.setText("Pause"); mode = RUNNING; gate.release(); } } |
|
返回顶楼 | |
发表时间:2009-05-24
wjyjimy 写道 怕麻烦的话就用thread.sleep();好了。。。虽然会出现很多不良效果。。
什么不良后果? |
|
返回顶楼 | |