请教高手,多线程的难题

jiangnancaizi 2009-07-16 04:42:10
以下代码是为了在代码中实现repeat键的(比如按1键,就会不断地打出1直到释放键, 下面的down指得是按下键事件,release 指得是释放键盘)


if (event.getAction() == MotionEvent.ACTION_DOWN) {
keyevent = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);

if((keycode >= keyevent.KEYCODE_0) && (keycode <= keyevent.KEYCODE_9)){
new Thread(){ //这个线程就是实现repeat的主要代码,相当于每次按下键都启动一个线程
public void run() {
int sleepTime = 800; // repeat的初始时间,就是说按下去800毫秒后才第一次repeat
while(true){
try {
sleep(sleepTime);
}catch (InterruptedException e) {
Log("test InterruptedException "); // 看看是否被中断
}
int action = keyevent.getAction();
if (action == MotionEvent.ACTION_UP){ //释放键的时候返回
return;
}

mHandler.SentMessage(发送一次虚拟down出去);
sleepTime = 200; // repeat间隔时间,就是第一次repeat开始后每隔这么久发一次虚拟down
}
}
}.start();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
keyevent = new KeyEvent(KeyEvent.ACTION_UP, keycode); //release事件发生
}

if (keyevent != null && (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)){
mHandler.SentMessage(第一次down和最后的release事件都从这里发出);
}


用以上代码,我输入字符,大部分都是正常,但是有时候输入一个键(比如1)会同时输出2个1出来,通过打日志,发现第一个sleep(sleepTime)好像根本没起作用,据说sleep会被其他线程中断,但是此时Log("test InterruptedException ") 却没有打出来啊,我甚至试着把整个Thread 用synchronized(this){}包起来,还是没用啊
...全文
40 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
diggywang 2009-07-17
  • 打赏
  • 举报
回复
给你个参考文章:http://www.yqdown.com/wangluobiancheng/J2ME/6421.htm
j2me中,尽量少用多线程,尤其是向你这种用法,线程对处理器的开销很大。
diggywang 2009-07-17
  • 打赏
  • 举报
回复
j2me中也有定时器的,所有的游戏动画之类的都是通过它来实现的,否则展示的将是一团糟!
jiangnancaizi 2009-07-17
  • 打赏
  • 举报
回复
啊,不好意思,我是在J2ME里面做的
diggywang 2009-07-16
  • 打赏
  • 举报
回复
swing中要慎用多线程,AWT Swing的框架机制是单线程模式的,全都工作在EDT线程里。如果是跟界面无关的,都可以用多线程在后台执行,但一旦是和界面显示有关,则必须在EDT线程中执行,否则很容易出错。你在这里实现一个Thread进行模拟,是不安全的。Swing已经给我们提供了一个javax.swing.Timer类,你只要实现一个ActionListener对象的actionPerformed方法,就行了。键盘按下去的时候,定时器启动,每个一个周期执行一次actionPerformed,这里的actionPerformed是在EDT线程中执行的,绝对安全。键抬起的时候,定时器取消。
jiangnancaizi 2009-07-16
  • 打赏
  • 举报
回复
我查看Thread.sleep的说明,说这个函数可能会被其他线程中断,我估计出现异常的那一次估计就是sleep被中断了? 但是为啥日志没打出来呢
gannbatte 2009-07-16
  • 打赏
  • 举报
回复
我也来期待一下。。。
jiangnancaizi 2009-07-16
  • 打赏
  • 举报
回复
期待看来落空
jiangnancaizi 2009-07-16
  • 打赏
  • 举报
回复
此贴期待高手出现,
jiangnancaizi 2009-07-16
  • 打赏
  • 举报
回复
就是说出现我所说的错误的时候(按下一个键很快会输出1个以上字符), 好像根本没经过第一个sleep(sleepTime)一样,哪怕我把
int sleepTime = 800改成int sleepTime = 8000都一样

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧