gpt4 book ai didi

java - 如何在java中同步方法?

转载 作者:行者123 更新时间:2023-11-30 07:30:22 24 4
gpt4 key购买 nike

我有一些小问题。我有一些类 ProcessorProcessProcess 类只有名称和值Processor 必须计算并显示该值。反过来,Processor实现Runnable接口(interface)但是我有一个麻烦。当我将进程设置为我的处理器时,它开始计算值,但我想启动另一个具有不同进程值的线程,并且该值也设置为第一个线程。这是代码

    package ua.edu.lp.controller;

import java.util.Random;

import ua.edu.lp.controller.processors.FirstProcessor;
import ua.edu.lp.controller.processors.MyBaseProcessor;
import ua.edu.lp.model.MyProcess;
import ua.edu.lp.model.Queue;

public class Computer {

private Queue<MyProcess> queue;

public void run() {
MyBaseProcessor myBaseProcessor = new FirstProcessor();
generateQueue();

for (int i = 0; i < queue.getQueue().size(); i++) {
MyProcess process = queue.get(i);
myBaseProcessor.setProcess(process);
Thread thread = new Thread(myBaseProcessor);
thread.start();
}
}

private void generateQueue() {
queue = new Queue<MyProcess>();
for (int i = 0; i < 10; i++) {
String name = "Process[" + (i + 1) + "]";
MyProcess myProcess = new MyProcess(name,
new Random().nextInt(10) + 1);
queue.add(myProcess);
System.out.println(myProcess.getName() + "\t"
+ myProcess.getValue());
}
}
}

基础处理器

package ua.edu.lp.controller.processors;

import ua.edu.lp.model.MyProcess;

public abstract class MyBaseProcessor implements Runnable {

protected MyProcess myProcess;

@Override
public void run() {
synchronized (myProcess) {
calculateValue();
}
}

protected abstract void calculateValue();

public synchronized MyProcess getProcess() {
return myProcess;
}

public synchronized void setProcess(MyProcess myProcess) {
synchronized (myProcess) {
this.myProcess = myProcess;
}

}

}

和第一个处理器

package ua.edu.lp.controller.processors;

public class FirstProcessor extends MyBaseProcessor {

@Override
protected synchronized void calculateValue() {
System.out.println("First processor is working...");
int value = this.myProcess.getValue();
int result = (int) Math.pow(value, 2);
System.out.println("Pow of " + value + " = " + result);
System.out.println("First processor is free");
}

}

您可以从http://www.sendspace.com/file/5rlmkx 下载所有项目

最佳答案

使处理器无状态 - 删除字段进程并执行如下操作:

final Processor processor = new Processor();

processor.process(new Process(...));

public void process( final Process process ) {
new Thread(new Runnable() {
//do somethig with process
}).run();
}

注意:处理器只能执行常见任务 - 运行流程,流程实现业务逻辑,并且只有流程知道您已完成的计算。

关于java - 如何在java中同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900275/

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