【问题标题】:how to run "two different code" together?如何一起运行“两个不同的代码”?
【发布时间】:2022-10-05 19:03:59
【问题描述】:

我想创建一个基本的国际象棋时钟,但我卡住了。

package SatrancSaati;

import java.util.Scanner;

public class SatrancSaatiRunner {
    static int beyazZamani = 60;
    static int siyahZamani = 60;

    static boolean BeyazinSirasi = false;
    static boolean SiyahinSirasi = false;//rakip baslar

    static boolean zamanVarMi = true;

    public static void main(String[] args) throws InterruptedException {

        for (int i = 0; i < 999; i++) {

            Scanner scanner = new Scanner(System.in);
            System.out.println(\"Beyaz hamle yaptiktan sonra 1 e basmali\");
            System.out.println(\"Siyah hamle yaptiktan sonra 2 e basmali\");

            int kiminSirasi = scanner.nextInt();
            if (kiminSirasi == 1) {
                saatCalistirSiyah(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);

            } else if (kiminSirasi == 2) {
                saatCalistirBeyaz(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);
            }
        }
    }


    private static void saatCalistirBeyaz(boolean beyazinSirasi, int siyahZamani, boolean zamanVarMi, int beyazZamani, int siyahZamani1) throws InterruptedException {
        System.out.println(\"***Hamle Beyazda***\");
        while (true) {
            siyahZamani++;
            beyazZamani--;
            System.out.print(\"Beyaz: \" + beyazZamani + \" \");
            System.out.print(\"Siyah: \" + siyahZamani);
            System.out.print(\"\\u000C\");
            Thread.sleep(1000);

            if (beyazZamani <= 0 || siyahZamani <= 0) {
                break;
            }
        }
    }

    private static void saatCalistirSiyah(boolean beyazinSirasi, int siyahZamani, boolean zamanVarMi,
                                          int beyazZamani, int siyahZamani1) throws InterruptedException {
        System.out.println(\"***Hamle Siyahta***\");
        while (true) {
            beyazZamani++;
            siyahZamani--;
            System.out.print(\"Beyaz: \" + beyazZamani + \" \");
            System.out.print(\"Siyah: \" + siyahZamani);
            System.out.print(\"\\u000C\");
            Thread.sleep(1000);

            if (beyazZamani <= 0 || siyahZamani <= 0) {
                break;
            }
        }
    }
}

这是我的基本代码,我希望该代码像这样工作:

当我在 IntelliJ 上单击 1 时,黑色时间开始下降,白色时间增加相同的数量。当我单击 2 时运行此代码时,我想停止另一种方法并启动相反的方法,该方法增加了白色的时间并减少了相同数量的黑色时间。这非常困难,因为当我开始一种方法时,它一直有效直到完成。那是我的问题。

  • 您可以使用线程或ExecutorService
  • 也许更接近它:A timer 每秒滴答一次。当它滴答作响时,根据当前是轮到黑还是白,您相应地更新他们的时间计数。 While/sleep 循环倾向于从真实时间“漂移”,因为每次迭代并不需要 1 秒。
  • 两个信号量和一个单元?输入时,发出信号量并等待另一个信号量。

标签: java multithreading loops


【解决方案1】:

我不完全遵循您的要求。但听起来您正在寻找以多线程方式执行这些方法。

如果是这种情况,您似乎缺少一些东西,例如synchronized 关键字和Runnable 接口。

以下是一个示例,或许可以帮助您走上正确的道路。它按原样运行,但我相信您需要对其进行调整以实现您的目标:

package SatrancSaatiRunner ;

import java.util.Scanner;

public class SatrancSaatiRunner {
    static int beyazZamani = 60;
    static int siyahZamani = 60;

    static boolean BeyazinSirasi = false;
    static boolean SiyahinSirasi = false;// rakip baslar

    static boolean zamanVarMi = true;

    public static void main(String[] args) throws InterruptedException {

        SatrancSaatiRunner s = new SatrancSaatiRunner();

        for (int i = 0; i < 999; i++) {

            //Scanner scanner = new Scanner(System.in);
            System.out.println("Beyaz hamle yaptiktan sonra 1 e basmali");
            System.out.println("Siyah hamle yaptiktan sonra 2 e basmali");

            //int kiminSirasi = scanner.nextInt();
            //if (kiminSirasi == 1) {
            //    saatCalistirSiyah(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);

            //} else if (kiminSirasi == 2) {
            //      saatCalistirBeyaz(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);
            //}
        //}
      }

        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    s.saatCalistirSiyah(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);
                } catch (InterruptedException e) {
                    System.out.println(e);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    s.saatCalistirBeyaz(BeyazinSirasi, siyahZamani, zamanVarMi, beyazZamani, siyahZamani);
                } catch (InterruptedException e) {
                    System.out.println(e);
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void saatCalistirBeyaz(boolean beyazinSirasi, int siyahZamani, boolean zamanVarMi, int beyazZamani,
            int siyahZamani1) throws InterruptedException {
        synchronized (this) {
            System.out.println("***Hamle Beyazda***");
            while (true) {
                siyahZamani++;
                beyazZamani--;
                System.out.print("Beyaz: " + beyazZamani + " ");
                System.out.print("Siyah: " + siyahZamani);
                System.out.print("\u000C");
                Thread.sleep(1000);

                if (beyazZamani <= 0 || siyahZamani <= 0) {
                    break;
                }
            }
        }
    }

    private void saatCalistirSiyah(boolean beyazinSirasi, int siyahZamani, boolean zamanVarMi, int beyazZamani,
            int siyahZamani1) throws InterruptedException {
        System.out.println("***Hamle Siyahta***");
        while (true) {
            beyazZamani++;
            siyahZamani--;
            System.out.print("Beyaz: " + beyazZamani + " ");
            System.out.print("Siyah: " + siyahZamani);
            System.out.print("\u000C");
            Thread.sleep(1000);

            if (beyazZamani <= 0 || siyahZamani <= 0) {
                break;
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我非常接近解决我的问题,我按照你在这里的建议使用了多胎面。现在的问题是我无法管理 consol,因为当我需要发送输入信号时它不起作用,因为计时器每秒都在工作并且忽略用户输入。

    我使用了 1 个包和 3 个扩展父类的不同类。

    我还有一个问题,我使用“\u000C”(控制台清除代码)它以前可以工作,但现在我尝试了很多东西但没有用。

    package SatrancSaati;
    
    import mehmetHocaCalisma.Islemler;
    
    import java.util.Scanner;
    
    
    public class SatrancSaatiRunner {
        static int beyazZamani = 60;
        static int siyahZamani = 60;
    
        static boolean BeyazinSirasi = false;
        static boolean SiyahinSirasi = false;//rakip baslar
    
        static boolean zamanVarMi = true;
    
        public static void main(String[] args) throws InterruptedException {
            SiraBeyazda b = new SiraBeyazda();
            Thread beyazOynuyor = new Thread(b);
            SiraSiyahta s = new SiraSiyahta ();
            Thread siyahOynuyor = new Thread(s);
    
            while (true) {
    
                Scanner scanner = new Scanner(System.in);
                System.out.println("Beyaz hamle yaptiktan sonra 1 e basmali");
                System.out.println("Siyah hamle yaptiktan sonra 2 e basmali");
    
                int kiminSirasi = scanner.nextInt();
                if (kiminSirasi == 1) {
                    beyazOynuyor.stop();
                    siyahOynuyor.start();
    
    
    
                } else if (kiminSirasi == 2) {
                    siyahOynuyor.stop();
                    beyazOynuyor.start();
    
                }
                Thread.sleep(100);
            }
    
        }
    }
    
    
    
    
    package SatrancSaati;
    
    public class SiraBeyazda extends SatrancSaatiRunner implements Runnable {
    
        @Override
        public void run() {
            System.out.println("***Hamle Beyazda***");
            while (true) {
                siyahZamani++;
                beyazZamani--;
                System.out.print("Beyaz: " + beyazZamani + " ");
                System.out.print("Siyah: " + siyahZamani);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                if (beyazZamani <= 0 || siyahZamani <= 0) {
                    break;
                }
                System.out.println("\u000C");
            }
        }
    }
    
    
    
    
    
    package SatrancSaati;
    
    public class SiraSiyahta extends SatrancSaatiRunner implements Runnable {
    
    
        @Override
        public void run() {
            System.out.println("***Hamle Siyahta***");
            while (true) {
                beyazZamani++;
                siyahZamani--;
                System.out.print("Beyaz: " + beyazZamani + " ");
                System.out.print("Siyah: " + siyahZamani);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                if (beyazZamani <= 0 || siyahZamani <= 0) {
                    break;
                }
                System.out.println("\u000C");
            }
        }
    }
    

    【讨论】:

    • 我解决了我的问题,问题是我计划同时使用两个多线程和一个控件,我必须阻止它们运行并重新开始。在完成之前尝试完成在多胎面交易中开始的过程对我来说是一个问题。由于文件没有关闭,当我尝试再次运行同一个线程时,我运行了两次,我得到了异常,
    • 如果是这样,请更新您的答案,使其确实是回答,而不是后续问题(就像现在一样)。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2020-10-12
    相关资源
    最近更新 更多