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