While循环阻止其他线程

时间:2019-07-04 17:22:41

标签: java multithreading

我正在等待一个布尔值随while循环更改,但是while循环永远不会结束?我可能对此有些愚蠢

有效的代码。但是while循环永远不会结束,布尔值更改后我的代码也不会执行:

while(!myCoolBoolean);
//my code when the boolean has changed to true

有点奇怪,因为当我这样做时它可以工作:

while(!myCoolBoolean) {
    System.out.print();
}
//my code again

有帮助吗? 编辑:while循环实际上在一个线程中,而myCoolBoolean在另一个线程中被更改

2 个答案:

答案 0 :(得分:0)

尝试声明:

.Phony: all server dist clean IDIR = include CC ?= gcc USERFLAGS+= CLFLAGS += -I$(IDIR) -g -Wall -Wpedantic $(USERFLAGS) -std=c11 -Wno-format-extra-args ODIR=obj LDIR=lib SRCDIR=src LIBS=-lm SRCS= $(wildcard $(SRCDIR)/*.c) DEPS= $(wildcard $(ODIR)/*.o) OBJ = $(patsubst $(SRCDIR)/%, $(ODIR)/%, $(SRCS:%.c=%.o)) all: server.exe $(ODIR)/%.o: $(SRCDIR)/%.c @echo "Making objects..." mkdir -p $(ODIR) $(CC) -MMD $(CLFLAGS) -c -o $@ $< server.exe: $(OBJ) @echo "Compiling..." $(CC) -o $@ $(OBJ) $(CFLAGS) $(LIBS)

答案 1 :(得分:0)

我假设您正在尝试等待template <typename Outer> struct ContainingClass { template <typename T,class=void> struct Rule { Rule(T value); // ... other members ... }; template <class U> struct Rule<void,U> { Rule(); // ... different members than the non-void Rule<T> ... }; }; template <typename Outer> template <typename T, typename U> ContainingClass<Outer>::Rule<T,U>::Rule(T value) { } template <typename Outer> template <typename U> ContainingClass<Outer>::Rule<void,U>::Rule() { } 的值从另一个线程更改。如果是您的代码正在更新myCoolBoolean,则应改用myCoolBooleanwait()

  1. 在某个地方初始化对象,以便两个线程都可以访问它。
    notify()
  2. 编写而不是while循环
    public Object myCoolObject = new Object();
    
  3. 在您要更新synchronized(myCoolObject) { myCoolObject.wait(); } 的地方,执行
    myCoolBoolean

synchronized(myCoolObject) { myCoolObject.notify(); } 将暂停第一个线程,直到第二个线程调用wait();

如果您无法更改更新notify();的代码,则可以将循环更改为

myCoolBoolean

这样,您的代码将在每次迭代中暂停一毫秒,以给其他线程时间来更新标志。如果没有while (!myCoolBoolean) { wait(1); } ,仅会在执行循环时用完所有处理时间。