作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些小问题。我有一些类 Processor 和 Process。 Process 类只有名称和值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/
我是一名优秀的程序员,十分优秀!