Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:鼠标点击事件启动线程_Java_Multithreading - Fatal编程技术网

Java:鼠标点击事件启动线程

Java:鼠标点击事件启动线程,java,multithreading,Java,Multithreading,全部!:) 我是Java新手,所以,也许,我的问题有点愚蠢,但是。。。 我试图通过鼠标点击JButton来运行线程 在这里,我添加了一个鼠标侦听器: btnGo.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { ThreadTest t = new ThreadTest(); t.run(); } }); 还有我的ThreadTest课程: publi

全部!:) 我是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:”),但带有窗口的主线程挂起:( 为什么会发生这种情况?

运行()不会启动线程。请改为尝试启动()

但请注意:您只能启动一次线程

也许最好实现接口(未经测试,如果有编译错误,很抱歉):

然后:

btnGo.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e) {
  Thread t = new Thread(new RunnableTest());
  t.start();
  }
});
(可能您需要在…之前停止线程。

run()不启动线程。请改为尝试start()

但请注意:您只能启动一次线程

也许最好实现接口(未经测试,如果有编译错误,很抱歉):

然后:

btnGo.addMouseListener(new MouseAdapter() {
 @Override
 public void mouseClicked(MouseEvent e) {
  Thread t = new Thread(new RunnableTest());
  t.start();
  }
});
(也许你需要在…之前停止线程)

线程通过单击(我看到“控制台中的Tick-s:”)正常启动,但带有窗口的主线程挂起:(为什么会发生这种情况

事实上,当前线程(此处的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;
    }
}
线程通过单击(我看到“控制台中的Tick-s:”)正常启动,但带有窗口的主线程挂起:(为什么会发生这种情况

事实上,当前线程(此处的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;
    }
}

您需要锁定对象上的线程

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

}

您需要锁定对象上的线程

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

}
代替
t.run();
使用
t.start();
代替
t.run();
使用
t.start();