同步方法块执行

问题描述:

我正在实现一个带有三个类的虚拟程序,以更直观地参考Future的工作方式。我的问题是,有时程序将被锁定在同步方法,它不会继续。我找不到原因。有人能够发现为什么没有一个战士会打印“我赢了”的路线吗?当块同步方法块执行

我的电流输出:

Fighter1

Fighter1已进入同步方法

Fighter2

Fighter2已进入同步方法

的代码如下。

主要类:

import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class TmpTest { 
private static final ExecutorService executorService = 
    Executors.newFixedThreadPool(2); 

    public static void main(final String... args) { 

    final Fighter fighter1 = new Fighter("Fighter1"); 
    final Fighter fighter2 = new Fighter("Fighter2"); 

    final Future<String> submitFighter1 = executorService.submit(fighter1); 
    final Future<String> submitFighter2 = executorService.submit(fighter2); 

    while (!submitFighter1.isDone() || !submitFighter2.isDone()) { 
     if (submitFighter1.isDone()) { 
      System.out.println("Fighter 1 wins!"); 
      submitFighter2.cancel(true); 
      executorService.shutdown(); 
     } else if (submitFighter2.isDone()) { 
      submitFighter1.cancel(true); 
      System.out.println("Fighter 2 wins!"); 
      executorService.shutdown(); 
     } 
    } 
    } 
} 

战斗机类:

class Fighter implements Callable<String> { 

    private final String fighterName; 
    private final ClassWithSyncMethod classWithSyncMethod; 

    public Fighter(final String fighterName) { 
    this.fighterName = fighterName; 
    classWithSyncMethod = new ClassWithSyncMethod(fighterName); 
    } 

    @Override 
    public String call() throws Exception { 
    return classWithSyncMethod.syncMethod(); 
    } 
} 

虚拟类synchronized方法:

class ClassWithSyncMethod { 

    private final String fighterName; 

    public ClassWithSyncMethod(final String fighterName) { 
    this.fighterName = fighterName; 
    } 

    public synchronized String syncMethod() { 
    System.out.println(fighterName + " has entered the sync method"); 
    try { 
     Thread.sleep(1000); 
    } catch (final InterruptedException e) { 
     System.out.println("Exception trying to sleep the fighter " + fighterName + ";" + e); 
    } 
    return fighterName + " shouts: I won!"; 
    } 
} 

这有什么好做同步。每个战斗机在不同的物体上同步,所以它们不会相互干扰。

您看不到“我赢了”这一行的原因要简单得多 - 您永远不会打印它。 ClassWithSyncMethod#syncMethod()方法(由Fighter#call()返回)不会打印任何内容,它只是返回一个值。如果你想打印它,你必须自己去打印。

例如为:

while (!submitFighter1.isDone() || !submitFighter2.isDone()) { 
    if (submitFighter1.isDone()) { 
     System.out.println("Fighter 1 wins!"); 
     System.out.println(submitFighter1.get()); // Here! 
     submitFighter2.cancel(true); 
     executorService.shutdown(); 
    } else if (submitFighter2.isDone()) { 
     submitFighter1.cancel(true); 
     System.out.println("Fighter 2 wins!"); 
     System.out.println(submitFighter2.get()); // And here! 
     executorService.shutdown(); 
    } 
} 
+0

你是绝对正确的。我是个白痴。谢谢! – Tavo

+1

右键点'每个战士在不同的物体上同步',为你+1 –