不能.stop()。wait()或以任何方式停止线程

时间:2016-04-17 18:28:24

标签: java multithreading

我在使用actionPerformed上的JButton停止从课堂外开始的线程时遇到了麻烦。下面的线程类的代码。

public synchronized void run ()
{
    try
    {
        do
        {
            int minuta = vrijeme / 60;
            int sekundi = vrijeme % 60;

            System.out.println(minuta+" "+sekundi);

            vrijeme = vrijeme - 1;
            delay = delay - 1000;

            if (minuta == stani && sekundi == 0)
            {

            }



            try 
            {
                Thread.sleep(1000);
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
        while (delay != 0);
        {
                //
        }
    }
    catch (Exception e)
    {
        System.out.println("Stao" + e);
    }
}
void pokreniThread()
{
    (new Thread(new OdredenoVrijeme())).start();
}
synchronized public void zaustaviThread()
{
    try
    {
        (new Thread(new OdredenoVrijeme())).wait();
    }
    catch (Exception e)
    {
        System.out.println("stao" +e);
    }
}

}

每当我拨打.sleep() .wait()或类似内容时,我都会收到以下捕获消息:

java.lang.IllegalMonitorStateException

3 个答案:

答案 0 :(得分:3)

在Java下,您无法在主进程中休眠。创建一个子线程,它将进行休眠,然后将消息发布到主线程中的处理程序,以便在超时后执行某些操作。

如果你想自己停止一个线程,在线程内部设置一个变量,如is_stopping = true,然后在线程中你可以在线程停止后设置一个变量is_running = false。

is_running=true;
while (is_running & !is_stopping)
{
   do_something();
   sleep();
}
is_stopping=false;
is_running=false;

答案 1 :(得分:0)

在java中,主线程正在程序中播放调度程序部分。所以在多线程情况下你有这些部分:

  • 调度器/控制器
  • 提供商
  • 客户

主线程应始终播放程序的调度程序/控制器部分。顺便说一下,你没有以一种好的方式使用多线程。当绝对必要时使用synchronized。 看下面的代码。你应该使用这样的同步:

public class BlockingQueue<T> {

private Queue<T> queue = new LinkedList<T>();
private int capacity;

public BlockingQueue(int capacity) {
    this.capacity = capacity;
}

public synchronized void put(T element) throws InterruptedException {
    while(queue.size() == capacity) {
        wait();
    }

    queue.add(element);
    notify(); // notifyAll() for multiple producer/consumer threads
}

public synchronized T take() throws InterruptedException {
    while(queue.isEmpty()) {
        wait();
    }

    T item = queue.remove();
    notify(); // notifyAll() for multiple producer/consumer threads
    return item;
}

答案 2 :(得分:0)

您无法从外部上下文中停止线程。某些条件发生变化时,线程应自行停止。 你必须在你想要停止的线程中持有一个标志,并在线程中检查标志。如果标志被更改,那么线程本身应该什么也不做,它将自行退出