В разных классах в одну и то же время одна и та же переменная дает разные значения, как быть?

Добрый день!
В классе TimeCheck есть переменная play, сеттер и геттер для нее. Здесь выводится на экран значение play.
package AppPackage;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

  public class TimeCheck implements Runnable{
        MainClass MC = new MainClass();    
        private final Object lock = new Object();
        private boolean flag;
        private boolean stop;
        private boolean play;
        boolean alive;
        String time;
        
         public TimeCheck() {
             super();
        }
        
        Thread t;
        public TimeCheck(String aTime) {
           t = new Thread(this);
           time = aTime;
        }

        @Override
        public void run() {
            System.out.println("Вошли в " + t.getName());
            synchronized(lock) {
                while(!stop) {
                    try {
                        if(flag) lock.wait();   

                        Date date = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
                        if ( time.equals(sdf.format(date)) && !play) {
 /*----------->>>*/  System.out.println(t.getName() + " -> play = " + getIsPlaying());
                            System.out.println(t.getName() + " -> Звоню");
                            MC.Play("E:\\JP\\RAZNOE 2\\SimpleAlarm\\src\\AppPackage\\doom.mp3");
                        } else {
                            System.out.println("Время будильника не равно текущему " + sdf.format(date));
                        }
                        Thread.sleep(1000);
                    } 
                    catch (InterruptedException ex) 
                    {
                    }
                }
            }
                
        }
        public void playerStop() {                                   
            MC.Stop();
        }     
        public boolean getIsPlaying() {
            return play;
        }
        
        public void setIsPlaying() {
            play = true;
        }
        
        public void pauseThread() {
            flag = true;
            System.out.println("Зашли в паузу в " + t.getName());
        }

        public void resumeThread() {
            flag = false;
            synchronized(lock) {
                lock.notify();   
            }
        }
        public void stopThread() {
            stop = true;   // завершает поток естественно
            System.out.println("Зашли в стоп.");
        }
}


Есть класс MainClass. Здесь play сеттером присваивается true и выводится на экран.
package AppPackage;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class MainClass 
{
    
    FileInputStream FIS;
    BufferedInputStream BIS;
    
    
    public Player player;
    
    public boolean selected;
                
    public long pauseLocation;
    public long songTotalLenght;
    
     
    public void Stop() {
        if (player != null) {
            player.close();
            pauseLocation = 0;
            songTotalLenght = 0;
            
            
        }
    }
    
    public void Play(String path) {
        try {
            FIS = new FileInputStream(path);
            BIS = new BufferedInputStream(FIS);
            
            player = new Player(BIS);
            songTotalLenght = FIS.available();
            
            TimeCheck TC = new TimeCheck();
/*---->>>*/       TC.setIsPlaying();
/*---->>>*/       System.out.println("play в MainClass = " + TC.getIsPlaying());</b>
        } 
        catch (FileNotFoundException | JavaLayerException ex) 
        {
           
        } 
        catch (IOException ex) 
        {
            Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        new Thread(){
            @Override
            public void run(){
                try {
                    player.play();
                } 
                catch (JavaLayerException ex) 
                {
                
                }
            }
        }.start();  
    }
    
}


В консоль выводит вот что
run:
Вошли в Thread-1
Thread-1 -> play = false
Thread-1 -> Звоню
play в MainClass = true
Thread-1 -> play = false
Thread-1 -> Звоню
play в MainClass = true
Thread-1 -> play = false
Thread-1 -> Звоню
play в MainClass = true
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 3
Комментировать
AxianLTD
@AxianLTD
А чего getter and setter не synchronized?
Ответ написан
Комментировать
@loveangel Автор вопроса
Всем спасибо!
Пометил переменную play как volatile, а заодно, от безысходности, сеттер и геттер для нее пометил как synchronized. Не помогло.

В итоге пометил переменную play как static.
Помогло)))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы