簡體   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