>

내가 할 수있는 최선을 설명하려고 노력할 것이며, 내 문제를 이해할 수 있기를 바랍니다.

Java로 프로세서 시뮬레이션 프로그램을 설계하고 있으며 현재 프로그램의 실행을 제어 할 "클럭 단위"를 코딩하고 있습니다. 기본적으로 클래스 ClockUnit 가 있습니다  주기적으로 0과 1 사이의 상태를 변경합니다. 나는 두 번째 클래스 Processor 가 필요합니다  시계 유닛 클래스가 언제 상태를 변경했는지 알 수 있고 명령을 실행합니다. 그래서 ...

<올>
  • ClockUnit  상태 = 0.
  • Processor  아무것도하지 않습니다.
  • ClockUnit  상태 변경 = 1
  • Processor  명령을 실행합니다
  • 현재 ClockUnit 를 운영하고 있습니다  스레드 내 클래스, 이제 Processor 를 실행하는 방법이 필요합니다  명령을 실행하기 위해 시계의 상태를 지속적으로 확인하고 1로 변경되는 시점을 확인할 수 있습니다. 어떻게해야할지 모르겠습니다.

    두 번째 스레드를 작성하고 Processor 를 실행해야합니까?  두 번째 실에서 수업?

    내가해야 할 일이 분명하기를 바랍니다. 내 머리에는 아주 간단한 작업이지만 다른 스레드의 상태를 지속적으로 확인하려면 하나의 스레드가 필요하지만 어떻게 해야하는지 잘 모르겠습니다.

    아래에 코드를 게시했습니다. 그다지 복잡하지 않습니다.

    주류

    public class Main {
        private static ALU alu;
        private static ClockThread clockThread;
        public static void main(String[] args)
        {
            //two threads, both running at the same time, one thread has clock ticking, other thread gets state of ticking clock and executes on rising edge
    
            alu = new ALU();
            clockThread = new ClockThread("clockThread", 1);
            clockThread.start();
            while(clockThread.getClock().getState() == 1)
            {
                System.out.println("ON");
            }
    
        }
    }
    
    

    ClockThread 클래스

    import java.util.Timer;
    public class ClockThread extends Thread {
        private String threadName;
        private double instructionsPerSecond;
        private Timer timer;
        private Clock clockUnit;
        public ClockThread(String name, double insPerSec)
        {
            threadName = name;
            System.out.println("Clock thread initialised");
            instructionsPerSecond = insPerSec;
        }
        public void run()
        {
            clockUnit = new Clock(instructionsPerSecond);
            timer = new Timer();
            timer.scheduleAtFixedRate(clockUnit, 0, (long) (clockUnit.timePeriod() * 1000));
        }
        public Clock getClock()
        {
            return clockUnit;
        }
    }
    
    

    시계 클래스

    import java.util.TimerTask;
    public class Clock extends TimerTask{
        private int state = 0; //the state of the simulation, instrutions will execute on the rising edge;
        private double executionSpeed; //in Hz (instructions per second)
        private String threadName = "Clock";
        public Clock(double instructionsPerSecond)
        {
            executionSpeed = instructionsPerSecond;
            System.out.println("[Clock] Execution speed set to " + executionSpeed + "Hz. (" + timePeriod() + "s per instruction.)");
        }
        public void run()
        {
            toggleState();
            System.out.println("System State: " + state);
        }
        public void toggleState()
        {
            if(state == 1)
            {
                state = 0;
            }
            else if(state == 0)
            {
                state = 1;
            }
        }
        public double timePeriod() //takes the number of instructions per second (hz) and returns the period T (T = 1/f);
        {
            double period = 1/executionSpeed;
            return period;
        }
        public double getExecutionSpeed()
        {
            return executionSpeed;
        }
        public int getState()
        {
            return state;
        }
    }
    
    

    • 답변 # 1

      이미 신뢰할 수있는 클럭 소스 (생산자)가 있으므로 BlockingQueue를 사용하여 ALU에 'EdgeChange'경고를 보낼 수 있습니까? (명령 실행을 담당하는 장치). 클럭 소스는 에지 변경 이벤트와 ALU? 그것을받을 것입니다 (그리고 나중에 일을하십시오). 다른 스레드의 객체간에 이벤트를 공유하기 위해 코드가 약간 변경되었습니다.

      메인 :

         public static void main(String[] args) {
          BlockingQueue<Integer> edgeAlerts = new ArrayBlockingQueue<Integer>(2);
          clockThread = new ClockThread("clockThread", 1, edgeAlerts);
          clockThread.start();
          boolean isInterrupted = false;
          while(!isInterrupted) {
              try {
                  Integer edgeValue = edgeAlerts.take();
                  if (edgeValue == 1) {
                      System.out.println("Executing instruction");
                      // Perform the instruction
                  }
              } catch (InterruptedException e) {
                  isInterrupted = true;
              }
          }
      }
      
      

      BlockingQueue를 ClockThread에 전달해야합니다 ...

         private final BlockingQueue<Integer> edgeAlerts;
          public ClockThread(String name, double insPerSec, BlockingQueue<Integer> edgeAlerts)
          {
              threadName = name;
              this.edgeAlerts = edgeAlerts;
              System.out.println("Clock thread initialised");
              instructionsPerSecond = insPerSec;
          }
      
      

      그리고 당신의 시계에 :

      private final BlockingQueue<Integer> edgeAlerts;
          public Clock(double instructionsPerSecond, BlockingQueue<Integer> edgeAlerts)
          {
              this.edgeAlerts = edgeAlerts;
              executionSpeed = instructionsPerSecond;
              System.out.println("[Clock] Execution speed set to " + executionSpeed + "Hz. (" + timePeriod() + "s per instruction.)");
          }
      
      

      시계가 다음과 같이됩니다 :

      public void run()
          {
              toggleState();
              System.out.println("System State: " + state);
              edgeAlerts.offer(state);
          }
      
      

      이것이 당신에게 효과가 있는지 알려주세요.

    관련 자료

  • 이전 java - 버튼의 OnClickListener를 여러 번 호출
  • 다음 자바 스크립트에서 배열에서 반복 요소를 찾는 모든 방법은 무엇입니까