2016-06-09 107 views
0

我在Java中有一个关于线程的问题,它带有单线程及其关于停止线程并继续。Java简单线程和单线程IllegalMonitorStateException

我的代码的作用:类MainWindow创建一个Threadreference并在endloop中启动和停止它。

类MyThread启动线程。 run方法是很短,它是所有做的事: 1.将鼠标移动到屏幕的左侧 然后 2.将鼠标移动到屏幕

右侧当我启动程序我立即得到一个IllegalMonitorStateException并且不知道如何解决它。

public class MainWindow 
{ 
    public static void main(String[] args) throws Exception 
    { 
     MyThread mt = new MyThread(); 
     while(true) 
     { 
      mt.start(); 
      Thread.sleep(1000); 
      mt.wait(); 
     } 
    } 
} 

public class MyThread implements Runnable 
{ 
    private Thread th; 
    public MyThread() throws Exception 
    { 
     th = new Thread(); 
     th.start(); 
    } 
    public void start() throws InterruptedException 
    { 
     synchronized(this){ 
     th.wait(); 
     } 
    } 
    public void wait() 
    { 
     synchronized(this){ 
     th.notifyAll(); 
     } 
    } 
    @Override 
    public void run() 
    { 
     //do something 
    } 
} 

感谢您的帮助! :)

+1

你这样做是错的。你不能通过调用'Thread#wait()'方法来告诉线程等待。该方法做了完全不同的事情。 – zapl

+0

哦,好吧,我明白了,我想我明白了,它只是用于多线程。我用它,因为我需要停止线程,但我读过,如果线程是通过运行方法它死了,所以我无法阻止它...我必须重读一些东西,然后再试一次 – SergSam

+0

是的,你必须阅读一下:)你的run方法一点也不用,你需要将'Runnable'传递给它的构造函数的线程(例如'th = new Thread(this);'),代码中的线程和运行方法不起作用。 – zapl

回答

0
while(true) 
     { 
      mt.start(); 
      Thread.sleep(1000); 
      mt.wait(); 
     } 

您不应使运行线程可运行。即)你不能启动已经运行的线程。