[英]Java: Starting Thread on mouse click event
所有! :)我是Java的新手,所以,也许我的问题有点愚蠢,但是...我试图通过在JButton上单击鼠标来运行线程。
在这里,我添加了一个鼠标侦听器:
btnGo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
ThreadTest t = new ThreadTest();
t.run();
}
});
还有我的ThreadTest类:
public class ThreadTest extends Thread{
public void run()
{
while(true)
{
System.out.println("Tick!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
单击(我看到“控制台中的Tick-s:”)正常启动线程,但是带有窗口的主线程挂起了:(Ц为什么发生这种情况?
run()无法启动线程。 尝试使用start()代替。
btnGo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
ThreadTest t = new ThreadTest();
t.start();
}
});
但请注意:您只能启动Thread一次!
也许最好实现接口(未经测试,对不起,如果有编译错误):
public class RunnableTest implements Runnable{
public void run()
{
while(true)
{
System.out.println("Tick!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
接着:
btnGo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Thread t = new Thread(new RunnableTest());
t.start();
}
});
(也许您需要先停止线程...)
单击(我看到“控制台中的Tick-s:”)正常启动线程,但是带有窗口的主线程挂起了:(Ц为什么发生这种情况?
实际上,当前线程(此处为UI线程)已进入run
方法。 如果您的GUI是此线程,则负责刷新。 由于忙于“ Ticks”消息的竞价,因此该窗口将挂起...
替换此行编码:
t.run();
有了这个:
t.start();
不要忘记找到退出run方法的干净方法。 否则,您的线程将永远运行直到JVM停止。 您最终将得到如下结果:
public class ThreadTest extends Thread{
private boolean canGo=true;
public void run()
{
while(canGo)
{
System.out.println("Tick!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void kill() {
canGo = false;
}
}
public class Mouse implements MouseListener, Runnable
{
Thread mouseWork;
@Override
public void run()
{
while(true)
{
System.out.println("CRAZY!!!");
System.out.println("!!!CRAZY");
}
}
public void mousePressed(MouseEvent e)
{
mouseWork = new Thread(this);
mouseWork.start();
System.out.println("GO!");
}
@Override
public void mouseReleased(MouseEvent e)
{
mouseWork.stop();
System.out.println("STOP!");
}
您需要锁定线程onject
public class ThreadTest extends Thread{
public void run()
{
while(true)
{
System.out.println("Tick!");
try {
synchronized(this)
{
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.