Problemas y dudas Thread e interfaces

Primero que nada buenos dias,este es mi problema, tengo que hacer un cronometro usando obligatoriamente estas clases:
clase entidad= aqui se guardan las variables horas, minutos ,segundos junto con sus getters and setter.
clase vista = donde se crea la interfaz grafica del cronometro y aqui se implementa la interface
interface interfaz, con este se debe conectar la vista con la clase logica
clase logica = aqui se realizaran los calculos delcronometro y aqui se implementara runnable y la interface
Bien , se supone que en la vista se llamaran a los metodos de logica para usar los threads en logica y y asi calcule cada segundo que pase, pero para imprimirlos en lainterfaz debo mandarselo por medio de la interface a laclase entidad y que la vista los muestre en la interfaz grafica, pero esto mandando un objeto de entidad mediante la interface, sin embargo no se como hacer eso , no tengo ni la menor idea de como hacer de como mandar un objeto entidad a traves de la interface y que me lo muestre en interfaz grafica, ademas de que los threads no me estan funcionando tampoco, en fin.. gracias por su atencion.

Y aqui esta mi codigo:

package threads;

public class Main {

public static void main(String[] args) {

Vista croni=new Vista();
}

}

package threads;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Vista extends JFrame implements Interfaz {

Logica logica = new Logica();
Entidad entidad = new Entidad();
JLabel tiempo;
JButton iniciar;
JButton detener;
JButton reanudar;
JButton reiniciar;

public Vista()
{
setTitle("Super Cronometro");
setSize( 400, 150 );
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setVisible(true);

tiempo = new JLabel( "00:00:00" );
tiempo.setFont( new Font( Font.SANS_SERIF, Font.BOLD,55));
tiempo.setHorizontalAlignment( JLabel.CENTER );
tiempo.setForeground( Color.BLACK );

add( tiempo, BorderLayout.NORTH);

final JButton iniciar = new JButton( "Iniciar" );
iniciar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
iniciar.setEnabled(false);
logica.iniciarCronometro();
}
});

JButton detener = new JButton( "Detener" );
detener.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
iniciar.setEnabled(true);
logica.detenerCronometro();
}
});

JButton reanudar = new JButton( "Reanudar" );
reanudar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){

}
});
JButton reiniciar = new JButton( "Reiniciar" );
reiniciar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){

}
});

JPanel panelBoton = new JPanel();
panelBoton.setLayout(new GridLayout(1,4,4,4));
panelBoton.add(iniciar);
panelBoton.add(detener);
panelBoton.add(reanudar);
panelBoton.add(reiniciar);
add(panelBoton, BorderLayout.CENTER);
}

public void segundero(Entidad logica) {

tiempo.setText(entidad.getHoras() +":"+
entidad.getMinutos() +":"+entidad.getSegundos());
}
}

package threads;

public interface Interfaz {

public void segundero(Entidad logica);

}

package threads;

public class Entidad {

private String segundos="00";
private String minutos="00";
private String horas="00";

public String getSegundos()
{
return segundos;
}

public void setSegundos(String segundos)
{
this.segundos = segundos;
}

public String getMinutos()
{
return minutos;
}

public void setMinutos(String minutos)
{
this.minutos=minutos;
}

public String getHoras()
{
return horas;
}

public void setHoras(String horas)
{
this.horas = horas;
}
}

package threads;

public class Logica implements Runnable,Interfaz{

boolean cronometroActivo;
Thread hilo;
int horas=0;
int min = 0;
int seg = 0;
String hora;
String minutos;
String segundos;

public void segundero(Entidad entidad) {

}

public void run() {

try
{

while(cronometroActivo)
{
System.out.println("a");
Thread.sleep(60000);
seg++;

if(seg == 60)
{
seg = 0;
min ++;

if(min == 60)
{
min=0;
horas++;
}
}

if(horas<10)
{
hora = "0"+ Integer.toString(horas);
}
else
{
hora = Integer.toString(horas);
}

if(min<10)
{
minutos = "0"+ Integer.toString(min);
}
else
{
segundos = Integer.toString(seg);
}
System.out.println(hora+":"+minutos+":"+segundos);

}

}catch(Exception e){
System.out.println(hora+":"+minutos+":"+segundos);
}
}

public void iniciarCronometro(){
cronometroActivo = true;
hilo = new Thread(new Logica());
//System.out.println("a");
hilo.start();
}

public void detenerCronometro()
{
cronometroActivo = false;
hora="0";
minutos="0";
segundos="0";
}

public void reiniciarCronometro()
{
hora="0";
minutos="0";
segundos="0";
cronometroActivo=true;
hilo = new Thread(this);
hilo.start();
}

public void pausarCronometro(){
cronometroActivo = false;
hilo = new Thread(this);
hilo.start();
}

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Formato al código

Primero para poder ayudarte creo que es necesario que le des formato al código empieza por ir a este sitio web y hacer que tu código quede en un formato más legible.

De ahí, edita tu publicación y el código con formato ponlo entre las etiquetas:
<code>Aquí pegas tú código con formato. </ code>
OJO: No debe haber espacio entre "/" y "code". Lo puse para que se viera cómo debe cerrarse cada etiqueta.

Con tu duda. Creo que el propósito de esto es enseñarte cómo separar la vista, de los objetos, de la lógica. Para poder usar una interfaz es necesario implementarla.

Vamos a poner un ejemplo, digamos que tenemos la interfaz velocidad:

/* Favor de ignorar los ---- */
public interface Speed{
--public void apply(Car car, Float s);
}

Luego vamos a decir que existen dos eventos, acelerar y desacelerar:

/* Favor de ignorar los ---- */
public class Accelerate implements Speed{

--@Override
--public void apply(Car car, Float s){
----System.out.println("Getting faster...");
----Float sp = car.getSpeed() + s;
----car.setSpeed(sp);
--}

}

/* Favor de ignorar los ---- */
public class Decelerate implements Speed{

--@Override
--public void apply(Car car, Float s){
----if(car.getSpeed() > 0){
------System.out.println("Getting slower");
------Float sp = car.getSpeed() - s;
------Float fsp = sp > 0 ? sp : 0.0f;
------car.setSpeed(fsp);
----}else{
------System.out.println("Car is stopped.");
----}
--}

}

Luego, ahora necesitamos entidad, que en este caso vendría siendo la clase carro:

/* Favor de ignorar los ---- */
public class Car{

--private Float speed = 0.0f;

--public Float getSpeed(){
----return speed;
--}

--public void setSpeed(Float speed){
----this.speed = speed;
--}

--public String printSpeed(){
----return String.format("I'm going %.2f Km/H", this.speed);
--}
}

Es necesario hacer una pasarela entre la vista y la lógica:

public class SpeedGateway{
--private JTextField change;
--private JTextField display;
--private Car car;
 
--public SpeedGateway(JTextField change, JTextField display, Car car){
----this.change = change;
----this.display = display;
----this.car = car;
--}
 
--public void changeSpeed(Speed sp){
----try{
------Float s = Float.parseFloat(change.getText());
------speed.apply(car, s);
------display.setText(car.printSpeed());
----}catch(NumberFormatException nfe){
------System.out.println("Error al convertir texto en el campo de texto, se esperan números");
----}
--}
}

Después creamos la vista:

public class View{
--private Accelerate accelerate = new Accelerate();
--private Decelerate decelerate = new Decelerate();

/* Labels, layout y demás cosas necesarias de la interfaz */
--private SpeedGateway speedGateway = new SpeedGateway(txtChangeSpeed, txtDisplaySpeed, new Car());

--JButton btnAcelerar = new JButton( "Acelerar" );

--btnAcelerar.addActionListener(new ActionListener(){
----speedGateway.changeSpeed(accelerate);
--});

--JButton btnDesacelerar = new JButton( "Desacelerar" );

--btnDesacelerar.addActionListener(new ActionListener(){
----speedGateway.changeSpeed(decelerate);
--});

}

Creas la clase principal:

public class Main{
--public static void main(String ... args){
----View v = new View();
--}
}

Y ya quedaría.