Newsgroup: it.comp.java
Titolo: Concorrenza, threads

Ciao a tutti sto cercando di creare una classe Sync che sincronizzi
l'accesso di + threads ad un array.
Ho creato 3 classi: Programma, Sync e Accesso ma quando le compilo mi da un
errore.. non riesco a capire esattamente che problema ci sia.
Provo a passare come parametro 1 al metodo read_permission della classe Sync
ma mi da errore e lo stesso con il metodo end_use.
Per ora sto provando il programma solo sul secondo elemento dell'array
(libero[1]).
Questo è l'errore che mi da:
c:\prova\Accesso.java:18: Can't make static reference to method void
read_permis
sion(int) in class Sync.
           Sync.read_permission(1);
                               ^
c:\prova\Accesso.java:21: Can't make static reference to method void
end_use(int
) in class Sync.
           Sync.end_use(1);
         ^
Vi riporto anche il codice dei 3 file:
//FILE Programma.java
import java.io.*;
import java.lang.*;
class Programma
{
    public static void main (String[] arg)
    {
        Sync S=new Sync(10);
        System.out.println("Ho creato un oggetto S Sync");
 /*for (int i=0; i<10; i++)
   System.out.println(S.libero[i]);*/
 Runnable T1 = new Accesso(1000);
        Runnable T2 = new Accesso(500);
        new Thread(T1).start();
        new Thread(T2).start();
    }
}
//FILE Sync.java
import java.io.*;
import java.lang.*;
public class Sync
{
  private boolean libero[];
  private int dim;
//COSTRUTTORE
  Sync (int dim)
  {
    libero = new boolean[dim];
    for (int i=0; i<10; i++)
 libero[i] = true;
  }
//METODI
  public synchronized void read_permission (int record_number)
  {
    try
    {
 while (libero[record_number]==false) wait();
        libero[record_number] = false;
        System.out.println("array[1] occupato");
 notify();
    }
 catch (InterruptedException e) {
         return;
    }
  }
  synchronized void end_use (int record_number)
  {
    System.out.println("Libero array[1]");
    libero[record_number] = true;
    notify();
  }
}
//FILE Accesso.java
import java.io.*;
import java.lang.*;
public class Accesso extends Thread implements Runnable
{
  int delay;
  public Accesso (int delayTime)
  {
     delay = delayTime;
  }
  public void run ()
  {
     try {
  while (true)
  {
    Sync.read_permission(1);
    System.out.println("Accesso array[1]");
    Thread.sleep(delay);
    Sync.end_use(1);
  }
     } catch (InterruptedException e) {
 return;
     }
  }
}
Ecco tutto spero che qualcuno mi possa aiutare... intanto grazie in
anticipo!!!! CIAO!

 
Basta leggere. Sync e' il nome di una classe, e Sync.read_permission() e'
il nome di un metodo statico read_permission della classe Sync. 
Ora, se questo metodo non c'e' o non e' statico, il compilatore ti dice
che hai sbagliato: quindi o rendi il metodo statico, o devi creare
un'istanza di Sync per usarlo. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

            Sync.read_permission(1);
[CUT]
Non ho capito bene quello che cerchi di fare .. ma sei sicuro che il mitico
Java non riesca già a fare quello che ti serve ?
comunque l'errore stà nel fatto che tu stai provando a richiamare
staticamente un metodo di un oggetto che non è statico.
Per eseguire una chiamata del genere devi istanziarti un oggetto Sync e poi
richiamare il metodo read_permission sull'oggetto creato o, in alternativa,
define il metodo come static ...
Ciao ciao
Dani
--
Daniele Piras
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If at first the idea is not absurd then there is no hope for it. - Albert
Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ciao.
Scusa, ma se non ho capito male devi sincronizzare + thread su un unico 
array.
Ovvero, hai una array tipo int[] e vuoi che più thread accedano a TUTTO 
l'array in modo sincronizzato.
Credo che bast scrivere nel codice
//definisci l'array da qualche parte....
int[] theCommonArray;
....
public void run ()
   {
    ....codice codice
    synchronized(theCommonArray)
    {
      //lavora qua con l'array che avrai passato in qualche modo alla 
classe Thread in questione....
      theCommonArray[4]=5;
      //ecc...
    }
....codice codice
   }
....
Spero che ti aiuti. Mi pare TUTTO superfluo quello che vuoi fare tu.
Ciao
Marco
-- 
  /"\  .. . . . . . . . . . . . .
  \ /  . ASCII Ribbon Campaign  .
   X   .- NO HTML/RTF in e-mail .
  / \  .- NO Word docs in e-mail.
       .. . . . . . . . . . . . .