gpt4 book ai didi

java - Java中的工作线程可以调用主线程吗?

转载 作者:行者123 更新时间:2023-12-02 19:35:34 24 4
gpt4 key购买 nike

我有一个名为 action() 的方法,它部署三个线程。每个部署的线程或工作线程都会根据 boolean 类型的单个实例变量为 true 陷入 while 循环,例如 boolean doWork = true,每个线程将有一个 while(doWork){} 循环。

当线程完成作业时,会将 doWork 设置为 false,从而阻止所有线程循环。然后我希望能够以某种方式让主线程调用 action() 方法来重新部署线程来完成另一项工作。 (如果我使用其中一个工作线程来调用 action() 方法可以吗?)工作线程一旦调用 action() 方法就会终止并以某种方式死亡吗?

为了简单起见,我将示例限制为两个线程

谢谢

class TestThreads{
boolean doWork = true;

void action(){
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
}

//innerclasses

class ThreadOne implements Runnable{
Thread trd1;
public ThreadOne(){//constructor
if(trd1 == null){
trd1 = new Thread(this);
trd1.start();
}
}
@Override
public void run(){
while(doWork){
//random condition
//would set doWork = false;
//stop all other threads
}
action();//is the method in the main class
}
}
class ThreadTwo implements Runnable{
Thread trd2;
public ThreadTwo(){//constroctor
if(trd2 == null){
trd2 = new Thread(this);
trd2.start();
}
}
@Override
public void run(){
while(doWork){
//random condition
//would set doWork = false;
//stop all other threads
}
action();//is the method in the main class
}
}

}

最佳答案

这个实现怎么样:

声明一个类成员doWork、当前 Activity 线程的计数器和同步对象:

private volatile boolean doWork = true;
private AtomicInteger activeThreads;
private Object locker = new Object();

主要内容:

while(true) {
// call action to start N threads
activeThreads = new AtomicInteger(N);
action(N);
// barrier to wait for threads to finish
synchronized(locker) {
while(activeThreads.get() > 0) {
locker.wait();
}
}
}

在线程主体中:

public void run() {
while(doWork) {
...
// if task finished set doWork to false
}

// signal main thread that I've finished
synchronized(locker) {
activeThreads.getAndDecrement();
locker.notify();
}
}

关于java - Java中的工作线程可以调用主线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100515/

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