Tentativa de programação multithread [Resolvido]

oi gente, to tentando fazer um exercicio pra faculdade, o objetivo é usar programação multithread, ela ta funcionando de certa forma, pois consigo imprimir valores na tela com System.out.println() instanciando varios objetos e iniciando eles com ‘start’.

gostaria de simplesmente fazer com que as minhas imagens se locomovessem no JFrame

o problema é que eu quero mudar a variavel frame, usando as thread, porém não sei como posso ter acesso a essa variavel a parte da Classe Escrita1 ou Escrita2,

é falta de conhecimento mesmo, não sei como acessar a variavel frame(que é um objeto) através da classe Escrita.

Espero que eu tenha conseguido explicar direito, t+

ai esta o codigo

[code]import java.awt.Color;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Principal extends JFrame {

public static int i;
private static int numero;

public static void main(String[] args) {
    
    Escrita1 e0 = new Escrita1();
    Escrita1 e1 = new Escrita1();
    Escrita1 e2 = new Escrita1();
    Escrita2 e3 = new Escrita2();

    e0.setName("MinhaThread1: ");
    e1.setName("MinhaThread2: ");
    e2.setName("MinhaThread3: ");
    e3.setName("MinhaThread4: ");

    e0.start();
    e1.start();
    e2.start();
    e3.start();

    JFrame frame = new JFrame();

    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setLocation(120, 75);

    frame.setResizable(false);
    frame.getContentPane().setBackground(new Color(255,255,255));
    ImageIcon imagem_logo = new ImageIcon("C:/Documents and Settings/estinfo/Meus documentos/apache-tomcat-6.0.30_eclipse/webapps/ROOT/tomcat.gif");
    JLabel lb_logo = new JLabel(imagem_logo);

    imagem_logo = new ImageIcon("C:/Documents and Settings/estinfo/Meus documentos/apache-tomcat-6.0.30_eclipse/webapps/ROOT/tomcat.gif");
    JLabel lb_logo1 = new JLabel(imagem_logo);

    JLabel la_texto = new JLabel("texto simples");

    frame.getContentPane().setLayout(null);

    frame.getContentPane().add(lb_logo);
    frame.getContentPane().add(lb_logo1);
    frame.getContentPane().add(la_texto);
    lb_logo.setBounds(0,0,200,100);
            
    lb_logo1.setBounds(0,100,200,100);
          
    la_texto.setBounds(0,180,200,100);
    lb_logo1.setLocation(0, 200);
    //lb_logo.setLocation(120, 175);
    if(e0.isAlive() == true)
    {
        System.out.println("nao acabou");
    }
    else
        System.exit(EXIT_ON_CLOSE);

}

}

class Escrita1 extends Thread {

    //public static int i;

@Override
public void run() {

           while(Principal.i<1000) {
               System.out.println(super.getName()+Principal.i);
               Principal.i =  Principal.i + (int) ((Math.random() * 15)) ;
               try {
            Thread.sleep( 1000 ); // coloca a "thread" para "dormir" 1 segundo
            } catch (InterruptedException e) {
            e.printStackTrace( System.err );
            }
           }

    }

}
class Escrita2 extends Thread {

@Override
public void run() {

           while(Principal.i<1000) {
               System.out.println(super.getName()+Principal.i);
               Principal.i =  Principal.i + (int) ((Math.random() * 15)) ;
               try {
            Thread.sleep( 1000 ); // coloca a "thread" para "dormir" 1 segundo
            } catch (InterruptedException e) {
            e.printStackTrace( System.err );
            }
           }

    }

}

[/code]

Multithread para mover um objeto ?
Esse objeto teria q ser syncronized. E o não iria melhorar o desempenho.

desculpe, eu não expliquei bem, na verdade gostaria de movimentar varios objetos, cada um deles seria movimentado por uma thread, o problema é que eu não estou conseguindo mover nem um deles

cria um construtor da sua classe que recebe o objeto que vc quer locomover…

class Escrita1 extends Thread {  
  
     private JLabel label;

     Escrita1 ( JLabel label ) {
          this.label = label;
     }

        //public static int i;  
  
    @Override  
    public void run() {  
  
               while(Principal.i<1000) {  

                   // mexe seu label aqui.........
                   
                   System.out.println(super.getName()+Principal.i);  
                   Principal.i =  Principal.i + (int) ((Math.random() * 15)) ;  
                   try {  
                Thread.sleep( 1000 ); // coloca a "thread" para "dormir" 1 segundo  
                } catch (InterruptedException e) {  
                e.printStackTrace( System.err );  
                }  
               }  
  
        }  
  
} 

não sei se ajuda… nem se é certo…
mas vai tentando

valeu pela ajuda gente, eu consegui

o problema de tudo é que eu estava chamando a variavel frame dentro do void main

[code] public static void main(String[] args) {

JFrame frame = new JFrame();
[/code]

pra poder chama-la em outra classe, ou seja, nas classes que estavam extendendo as threads eram criadas eu simplesmente criei a variavel frame antes do void main da classe Principal e chamei ela como publica e estatica

public class Principal extends JFrame {

public static JFrame frame = new JFrame();

eu ainda tive que criar os elementos, os ImageIcon dentro da classe Principal, para so depois ir atualizando a posição deles dentro das threads

ai esta o codigo funcionando, mas depois vou dar uma melhorada nele

import java.awt.Color;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Principal extends JFrame {


    public static int i;
    private static int numero;
    public static JFrame frame = new JFrame();
    public static ImageIcon imagem_logo = new ImageIcon("C:/Documents and Settings/estinfo/Meus documentos/apache-tomcat-6.0.30_eclipse/webapps/ROOT/tomcat.gif");
    public static JLabel lb_logo = new JLabel(imagem_logo);
    public static final JLabel lb_logo1 = new JLabel(imagem_logo);

    public static void main(String[] args) {
        
        Escrita1 e0 = new Escrita1();
        Escrita1 e1 = new Escrita1();
        Escrita1 e2 = new Escrita1();
        Escrita2 e3 = new Escrita2();

        e0.setName("MinhaThread1: ");
        e1.setName("MinhaThread2: ");
        e2.setName("MinhaThread3: ");
        e3.setName("MinhaThread4: ");

        e0.start();
        e1.start();
        e2.start();
        e3.start();

        

        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLocation(120, 75);

        frame.setResizable(false);
        frame.getContentPane().setBackground(new Color(255,255,255));
        

        
        
        JLabel la_texto = new JLabel("texto simples");

        frame.getContentPane().setLayout(null);

        frame.getContentPane().add(lb_logo);
        frame.getContentPane().add(lb_logo1);
        frame.getContentPane().add(la_texto);

        lb_logo.setBounds(0,50,200,100);               
        lb_logo1.setBounds(0,250,200,100);
        la_texto.setBounds(0,180,200,100);
        lb_logo1.setLocation(0, 200);
        
        

    }

}

class Escrita1 extends Thread {

    Principal obj_novoframe = new Principal();
        //public static int i;

    @Override
    public void run() {

               while(Principal.i<600) {
                   System.out.println(super.getName()+Principal.i);
                   
                   Principal.lb_logo.setLocation(Principal.i, 50);
                   

                   Principal.i =  Principal.i + (int) ((Math.random() * 10)) ;
                   if(Principal.i >= 600)
                       JOptionPane.showMessageDialog(null, "Corredor 1 terminou");
                   try {
                Thread.sleep( 100 ); // coloca a "thread" para "dormir" 1 segundo
                } catch (InterruptedException e) {
                e.printStackTrace( System.err );
                } 
               }

        }

}
class Escrita2 extends Thread {

    Principal obj_novoframe = new Principal();
        //public static int i;

    @Override
    public void run() {

               while(Principal.i<600) {
                   System.out.println(super.getName()+Principal.i);

                   Principal.lb_logo1.setLocation(Principal.i, 250);
                   if(Principal.i >= 600)
                       JOptionPane.showMessageDialog(null, "Corredor 2 terminou");

                   Principal.i =  Principal.i + (int) ((Math.random() * 10)) ;

                   try {
                Thread.sleep( 100 ); // coloca a "thread" para "dormir" 1 segundo
                } catch (InterruptedException e) {
                e.printStackTrace( System.err );
                }
               }

        }

}

valeu gente, t+