繁体   English   中英

Java:在鼠标单击事件上启动线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM