所有! :) 我是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 :)”,但带窗口的主线程挂起:( Цhy发生了什么?
答案 0 :(得分:3)
run()不启动Thread。请尝试使用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();
}
});
(也许你需要在...之前停止线程)
答案 1 :(得分:1)
线程正常启动通过单击(我看到“在控制台中的Tick-s :)”,但带窗口的主线程挂起:(Цhy发生这种情况?
实际上,当前线程(此处的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;
}
}
答案 2 :(得分:1)
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!");
}
答案 3 :(得分:0)
您需要锁定线程对象
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();
}
}
}
}