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

时间:2014-04-19 11:19:20

标签: java multithreading

所有! :) 我是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发生了什么?

4 个答案:

答案 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();
        }
    }       
}

}