Java线程调度
我有一个主修班,一个工人班和一个主管班。在MainClass中,我创建了10个Worker类和一个Supervisor类,它们在不同的线程中运行Java线程调度,java,multithreading,synchronization,Java,Multithreading,Synchronization,我有一个主修班,一个工人班和一个主管班。在MainClass中,我创建了10个Worker类和一个Supervisor类,它们在不同的线程中运行 class MainClass { public static void main(String args[]) { for (int i=0; i<10 ;i++) { Thread t = new Thread( new Worker()); t.start(); } (new Threa
class MainClass {
public static void main(String args[]) {
for (int i=0; i<10 ;i++) {
Thread t = new Thread( new Worker());
t.start();
}
(new Thread(new Supervisor()).start();
}
我不知道如何实现这一点,因为每个线程中的条件彼此独立,所以我不需要同步,所以我不能使用wait notify 根据我的理解,您希望创建单独的线程池,该线程池由10个工作线程组成,或根据您的要求创建10个工作线程 就池而言,您可以在
java.util.concurrent
api中检查ThreadPoolExecutor
。内部ThreadPoolexecutor
还为运行任务创建工作线程
尝试阅读ThreadPoolExecutor
它可能会帮助您或请详细说明您的问题您希望通过此问题实现的最终目标
我不知道如何实现这一点,因为每个线程中的条件彼此独立,所以我不需要同步,所以我不能使用wait notify
当然可以
这里的微妙之处在于,Supervisor
可能并不知道工作线程是否真的暂停了。(如果是,则条件是独立的。)
由于Supervisor不知道线程是否实际暂停(根据假设),因此您必须设计如果它试图取消暂停已取消暂停的线程,您希望发生什么
a) 一个无故的人应该什么都不做吗
b) 或者下次员工尝试暂停时,是否应立即取消暂停
如果答案是(b),那么您必须担心线程安全。如果答案是(a),则不需要(除非有其他数据要在线程之间传递!)
无论哪种方式,您仍然可以使用wait和notify。您的问题是什么?您是否查看了
java.util.concurrent
中可用的类?可能有帮助也许,您可以使用java.util.concurrent.ExecutorService
或NBlockingQueue
的一些实现,而不是某些条件
,每个工人一个,由主管提供相应的新可运行
或要处理的新数据?如果线程未暂停,则不执行任何操作。问题是我不明白如何在这里使用wait notify(我是初学者)。如果条件发生,工人等待,但如果内部条件发生,主管将重新启动暂停的工人,这与工人暂停的条件无关。那么,我应该在哪个锁上同步wait()和notify()?这是一个非常奇怪的情况,但好吧,假设这是真的,这并不重要。只需在单个全局对象上同步。调用wait并通知该对象。
class Worker extends Thread {
public void run() {
while(true) {
if(some_condition) {
//do stuff
} else {
// pause thread execution for undefined time.
}
}
}
}
class Supervisor extends Thread {
public void run() {
while(true) {
if(some_condition) {
// restart Workers thread that are paused.
}
// do other stuff
}
}
}