论坛首页 Java企业应用论坛

关于在Java游戏中实现暂停的讨论

浏览 14542 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-05-22  
我就简单说一句.
先别搞那个多线程,用一个线程先把程序写出来.
然后慢慢改成多线程的,啥问题都可以解决了.
0 请登录后投票
   发表时间: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。
0 请登录后投票
   发表时间: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();它也不会停止。
0 请登录后投票
   发表时间:2009-05-22  
liujunsong 写道
我就简单说一句.
先别搞那个多线程,用一个线程先把程序写出来.
然后慢慢改成多线程的,啥问题都可以解决了.

就有两个线程而已,一个用来接收用户输入,一个用来更新画面,我觉得这样至少两个线程吧。
0 请登录后投票
   发表时间:2009-05-22  
insiku 写道
唉 基础不是一般般的差

大哥,不要光感叹,基础也是慢慢练出来的啊。
0 请登录后投票
   发表时间: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("哦,电话来了");}
    }
}
0 请登录后投票
   发表时间: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()函数出现异常,在这种情况下就变成用异常来控制程序了。
0 请登录后投票
   发表时间: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("哦,电话来了");
    }
}
0 请登录后投票
   发表时间: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();
			}
		}

0 请登录后投票
   发表时间:2009-05-24  
wjyjimy 写道
怕麻烦的话就用thread.sleep();好了。。。虽然会出现很多不良效果。。

什么不良后果?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics