Java:鼠标点击事件启动线程
全部!:) 我是Java新手,所以,也许,我的问题有点愚蠢,但是。。。 我试图通过鼠标点击JButton来运行线程 在这里,我添加了一个鼠标侦听器:Java:鼠标点击事件启动线程,java,multithreading,Java,Multithreading,全部!:) 我是Java新手,所以,也许,我的问题有点愚蠢,但是。。。 我试图通过鼠标点击JButton来运行线程 在这里,我添加了一个鼠标侦听器: btnGo.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { ThreadTest t = new ThreadTest(); t.run(); } }); 还有我的ThreadTest课程: publi
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:”),但带有窗口的主线程挂起:(
为什么会发生这种情况?运行()不会启动线程。请改为尝试启动()
但请注意:您只能启动一次线程
也许最好实现接口(未经测试,如果有编译错误,很抱歉):
然后:
btnGo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Thread t = new Thread(new RunnableTest());
t.start();
}
});
(可能您需要在…之前停止线程。run()不启动线程。请改为尝试start()
但请注意:您只能启动一次线程
也许最好实现接口(未经测试,如果有编译错误,很抱歉):
然后:
btnGo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Thread t = new Thread(new RunnableTest());
t.start();
}
});
(也许你需要在…之前停止线程)
线程通过单击(我看到“控制台中的Tick-s:”)正常启动,但带有窗口的主线程挂起:(为什么会发生这种情况
事实上,当前线程(此处的UI线程)已进入run
方法。此线程负责刷新您的GUI。由于它忙于处理“Ticks”消息,窗口将挂起
更换这一行cocde:
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;
}
}
线程通过单击(我看到“控制台中的Tick-s:”)正常启动,但带有窗口的主线程挂起:(为什么会发生这种情况
事实上,当前线程(此处的UI线程)已进入run
方法。此线程负责刷新您的GUI。由于它忙于处理“Ticks”消息,窗口将挂起
更换这一行cocde:
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 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();
}
}
}
}
您需要锁定对象上的线程
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();
}
}
}
}
代替t.run();
使用t.start();
代替t.run();
使用t.start();