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