gpt4 book ai didi

java - 当主线程仍在运行时,线程如何通知主线程

转载 作者:行者123 更新时间:2023-12-01 12:22:25 25 4
gpt4 key购买 nike

我是 Java 初学者。我想通过生成一个线程来实现计时器。我想要运行的方式是主线程即使在生成线程后也应该继续工作。但是,一旦线程完成任务,它应该通知主线程任务已完成。我查看了 Thread.join() 和 Thread.sleep()。对于这两种方法,主线程都会等待线程完成任务。但是我希望主线程继续运行。

我在下面写了一段代码,其中主线程调用一个线程,该线程执行任务10s。但是我无法通知主线程任务完成情况。请帮助我。

public class MainThreadtest {
public static void main(String[] args) {
dispthread2 dt2 = new dispthread2();
dt2.start();
System.out.println("Thread dt2 has started");
}
}

二等

public class dispthread2 extends Thread {
public void run() {
long endTimemillis = System.currentTimeMillis() + 10000;
while (System.currentTimeMillis() < endTimemillis) {
}
System.out.println("The task is done");
}
}

最佳答案

解决此问题的一种方法不需要使用 Thread#join,从而允许两个线程独立运行:

  1. 使用观察者模式监听器接口(interface),例如可以通过 Java Beans PropertyChangeSupport 和 PropertyChangeListener 获取该接口(interface)。
  2. 不要扩展 Thread,而是实现 Runnable。
<小时/>

例如:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import javax.swing.event.SwingPropertyChangeSupport;

public class MainThreadTest {
public static void main(String[] args) {
DispThread2 dt2 = new DispThread2();
dt2.addPropertyChangeListener(DispThread2.STATE, new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("DT2 Thread state (from Main Thread): " + evt.getNewValue());
if (evt.getNewValue() == DispThreadState.DONE) {
System.out.println("Thread dt2 is now done (from Main Thread)");
}
}
});
new Thread(dt2, "DT2").start();
System.out.println("Thread dt2 has started");
}
}

class DispThread2 implements Runnable {
public static final String STATE = "state";
private volatile DispThreadState state = DispThreadState.PENDING;
private PropertyChangeSupport support = new SwingPropertyChangeSupport(this);

public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}

public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
support.addPropertyChangeListener(propertyName, listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
support.removePropertyChangeListener(listener);
}

public void run() {
setState(DispThreadState.RUNNING);
long endTimemillis = System.currentTimeMillis() + 10000;
while (System.currentTimeMillis() < endTimemillis) {
}
System.out.println("The task is done");
setState(DispThreadState.DONE);
}

public DispThreadState getState() {
return state;
}

public void setState(DispThreadState state) {
DispThreadState oldValue = this.state;
DispThreadState newValue = state;
this.state = state;
support.firePropertyChange(STATE, oldValue, newValue);
}
}

enum DispThreadState {
PENDING, RUNNING, DONE
}

关于java - 当主线程仍在运行时,线程如何通知主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com