如何在java中同步方法?

如何在java中同步方法?,java,multithreading,Java,Multithreading,我有一些小问题。 我有一些类处理器和进程进程类只有名称和值 处理器必须计算并显示该值。依次,处理器实现可运行接口 但是我有个麻烦。当我将进程设置到处理器时,它开始计算值,但我想用不同的进程值启动另一个线程,该值也设置为第一个线程。 这是代码 package ua.edu.lp.controller; import java.util.Random; import ua.edu.lp.controller.processors.FirstProcessor; import ua.edu

我有一些小问题。 我有一些类处理器进程进程类只有名称和值 处理器必须计算并显示该值。依次,处理器实现可运行接口 但是我有个麻烦。当我将进程设置到处理器时,它开始计算值,但我想用不同的进程值启动另一个线程,该值也设置为第一个线程。 这是代码

    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;

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");
    }

}

您可以从下载的所有项目这是巨大的代码…只编写所需的代码….
用于在java中同步。。。。你可以看一看。

您的所有任务都是独立的,因此您不需要在任何地方进行同步。但是,您正在共享一个BaseProcessor对象,该对象在同步时,在处理生命周期内不会同步

您只需要同步来处理共享数据,其中一个线程可以在线程启动后修改该数据

顺便说一句:我会使用ExecutorService,因为它将队列和线程池包装在一个类中

我假设您的队列是线程安全的,因为并非所有队列都是Java。如果不是的话,这可能是个问题


这个程序也做同样的事情,但是它是简单且线程安全的

ExecutorService service = Executors.newSingleThreadExecutor();
Random random = new Random();
for (int i = 0; i < 10; i++) {
    final String name = "Process[" + (i + 1) + "]";
    final int value = random.nextInt(10) + 1;
    service.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("First processor is working...");
            int result = (int) Math.pow(value, 2);
            System.out.println("Pow of " + value + " = " + result);
            System.out.println("First processor is free");
        }
    });
    System.out.println(name + "\t" + value);
}
service.shutdown();
ExecutorService service=Executors.newSingleThreadExecutor();
随机=新随机();
对于(int i=0;i<10;i++){
最终字符串名称=“进程[”+(i+1)+“]”;
最终整数值=random.nextInt(10)+1;
service.execute(新的Runnable(){
@凌驾
公开募捐{
System.out.println(“第一个处理器正在工作…”);
int result=(int)Math.pow(值2);
System.out.println(“功率”+值+“=”+结果);
System.out.println(“第一个处理器是免费的”);
}
});
System.out.println(名称+“\t”+值);
}
service.shutdown();

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

final Processor processor = new Processor();

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

public void process( final Process process ) {
    new Thread(new Runnable() {
        //do somethig with process
        }).run();
}
注意:处理器必须只执行普通任务才能运行流程,流程实现业务逻辑,并且只有流程知道您所做的计算

已同步(myProcess)

将仅为myProcess对象设置互斥对象。只有当两个对象指向同一个myProcess对象时,不同MyBaseProcessor对象之间的同步才会起作用

我不知道具体的要求是什么,但它对我来说似乎是正确的=>一个进程中不能有多个处理器工作

让我有点困惑的是,为什么还要在setterMethod setProcess(..)中与目标字段同步。这没有任何效果

也许您不明白同步将使用对象而不是类型来完成


比尔-迈克尔

很抱歉,但我不确定我是否明白这是怎么回事。预期的结果是什么?这是家庭作业吗?如果是这样的话,你应该给它贴上这样的标签,以最大限度地提高你获得好答案的机会。
ua.edu
软件包建议使用它的
[家庭作业]
;)我将尝试用Java学习多线程,所以我在大学里接受这个任务,它是我自己的队列类。它只包含一个列表。我怎么做?你能帮我吗?但是,在循环的每一步中,你都会创建新的可运行的(在我的例子中是处理器),但是我有固定的处理器数量。可运行的数量固定为10。为每个任务创建一个MyProcess。我使用了一个匿名类,但使用命名类可能更清晰(正如您所做的)。如果我修改了我的应用程序,并在循环的每一步创建FirstProcessor的新实例,它完全可以工作,但问题再次出现)一个处理器!我认为它将设置一个进程,当线程完成时,它将被设置为另一个线程的新进程。是的,你说得很对,一个处理器可能只处理一个进程,将来我需要用另一个逻辑制作第二个处理器,每个处理器只处理一个进程!好的,我想我理解我的错误。你的意思是只有几个进程通过一个处理器。我完全理解你们的意思吗?是的,处理器必须执行普通任务(运行进程),进程必须执行特定任务(运行计算)。
final Processor processor = new Processor();

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

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