Android Multithreading

Put your problem here if it does not fit any of the other categories.

Android Multithreading

Postby neosephiroth86 » Mon Sep 28, 2009 3:50 pm

HI!i am a newbie in Android developement,i am interesten in developing an application (it will be for university purposes) centered on android multithreading capabilities.
The following are a few questions i'm having and that I can't answer with my current knowledge:

1)I installed eclipse and all the add-ons needed for android software stack,for the code testing i'm using the dafault avd machine.I did manage to modify the avd default specs by using commands in dos prompt(for example the ram size)but I can't figure out how to change the system clock and what are the avd emulator processor specs regarding the threads,i mean is it a single threaded or double or more threaded processor abstraction?How many threads of execution can be simultauneously executed ?What are the limits?

2)I would like to write a simple application capable of showing the multithreading approach improvements over a single threaded non parallel execution,i would like to implement the Sieve of Eratosthenes algorithm to find the first n prime numbers.I would like to code it this way:there will be in the major thread a data pool formed of a matrix of prime numbers,a certain number of other threads will simultaneously work on this set of data by signing every number which is a multiple of another(for example for the number 2:2,4,6,8 and so on)and sign them as non prime numbers.Another thread will spawn and do the same for the 3 multiples and so on.
At the end only prime numbers will remain in the array non signed,they will be prime numbers
What classes and what api documentation should I use to implement what I want to do in an effective,sharp way?
Thanks

Here's a part of code ,a proof of concept for what I want to do,but it works in simple Java but not in Android.

//principal class
package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {

public static int max=3;//il numero fino al quale voglio trovare i numeri primi
public static boolean[] numeri=new boolean[max];
public static int start=2;

public void onCreate(Bundle SavedInstanceState) {
super.onCreate(SavedInstanceState);//super si usa per referenziare Activity,superclasse di HelloAndroid
TextView tv = new TextView(this);
Crivello a =new Crivello();
Thread uno=new Thread(a);
uno.start();
for(int i=2;i<max;i++){
if (HelloAndroid.numeri[i]){
String string=new String("Primo");
tv.setText(string+i);
setContentView(tv);
}
}

}
}

//secondary class
package com.example.helloandroid;

public class Crivello implements Runnable {

public void run(){


for(int i=2;i<HelloAndroid.max;i++){
HelloAndroid.numeri[HelloAndroid.start*i]=false;
}
HelloAndroid.start++;

}

}
neosephiroth86
Freshman
Freshman
 
Posts: 4
Joined: Mon Sep 28, 2009 3:22 pm

Top

Postby qlimax » Mon Sep 28, 2009 9:33 pm

Ciao,
ti scrivo in italiano... così sarò più chiaro.
in android le thread funzionano esattamente come in java.

mi sono permesso di fare alcune modifiche al tuo codice, ho anche cambiato il modo in cui imposti il layout (con xml).

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical"
  4.    android:layout_width="fill_parent"
  5.    android:layout_height="fill_parent"
  6.    >
  7.  
  8. <TextView android:text="@+id/TextView01" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
  9. </LinearLayout>
Parsed in 0.002 seconds, using GeSHi 1.0.8.4


Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package com.examples.numeri;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.widget.TextView;
  6.  
  7. public class NumeriPrimi extends Activity {
  8.         /** Called when the activity is first created. */
  9.  
  10.         public static int max = 50;// il numero fino al quale voglio trovare i
  11.                                                                 // numeri primi
  12.         public static boolean[] numeri = new boolean[max];
  13.         public static int start = 2;
  14.  
  15.         @Override
  16.         public void onCreate(Bundle savedInstanceState) {
  17.                 super.onCreate(savedInstanceState);
  18.                 setContentView(R.layout.main);
  19.                
  20.                
  21.                 for(int i=0;i<max;i++)
  22.                         numeri[i]=true;  // inizializziamo l' array
  23.  
  24.                 TextView tv = (TextView) this.findViewById(R.id.TextView01);
  25.                
  26.                 tv.setText("Waiting for numbers...");
  27.        
  28.  
  29.                 Thread uno = new Thread(new Crivello());
  30.                 uno.start();
  31.  
  32.                 try {
  33.                         uno.join(); //Aspettiamo che il thread esca dal metodo run... in questo modo avremo un
  34.                                         //risultato ottimale, in quanto il crivello avrà escluso
  35.                                         //tutti i non-primi
  36.                 } catch (InterruptedException e) {
  37.                        
  38.                 }
  39.                 tv.setText("");
  40.                
  41.                 for (int i = 2; i < max; i++) {
  42.                 if (NumeriPrimi.numeri[i]) {
  43.                                 String string = new String("Primo ");
  44.                                 tv.setText(tv.getText()+string+i+"n");
  45.  
  46.                         }
  47.                 }
  48.                
  49.  
  50.         }
  51. }
Parsed in 0.037 seconds, using GeSHi 1.0.8.4




Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package come.examples.numeri;
  2.  
  3. public class Crivello implements Runnable {
  4.  
  5.         public void run() {
  6.  
  7.                
  8.                 while(NumeriPrimi.start<NumeriPrimi.max/2){ //per ogni numero dobbiamo escludere i suoi multipli...
  9.                        
  10.                 for (int i = 2; NumeriPrimi.start * i < NumeriPrimi.max; i++) {
  11.                         NumeriPrimi.numeri[NumeriPrimi.start * i] = false;
  12.                 }
  13.                 NumeriPrimi.start++;
  14.                
  15.                 }
  16.  
  17.         }
  18.  
  19. }
Parsed in 0.032 seconds, using GeSHi 1.0.8.4


Image







Se vuoi, puoi passare la textview come argomento al costruttore della thread, in questo modo quando il crivello finisce di lavorare imposti il testo della textview dalla thread stessa.

Il vantaggio è che non devi chiamare il metodo join, e quindi puoi continuare ad eseguire altre istruzioni (mentre l' algoritmo lavora) nella tua activity senza dover aspettare.

Fammi sapere :)

Bye
¯`·.¸¸.><((((º>¯`·.¸¸. ><((((º>
User avatar
qlimax
Master Developer
Master Developer
 
Posts: 271
Joined: Mon Aug 31, 2009 10:54 am
Location: Swiss

Postby qlimax » Mon Sep 28, 2009 11:03 pm

un altra cosa... visto che hai messo il campo start come static, dovresti modificare il crivello cosi

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package ch.egsolutions.numeri;
  3.  
  4.  
  5.  
  6. public class Crivello implements Runnable {
  7.  
  8.  
  9.  
  10.         public void run() {
  11.  
  12.  
  13.  
  14.                
  15.  
  16.                 while(NumeriPrimi.start<NumeriPrimi.max/2){ //per ogni numero dobbiamo escludere i suoi multipli...
  17.  
  18.                        
  19.  
  20.                 for (int i = 2; NumeriPrimi.start * i < NumeriPrimi.max; i++) {
  21.  
  22.                         NumeriPrimi.numeri[NumeriPrimi.start * i] = false;
  23.  
  24.                 }
  25.  
  26.                 NumeriPrimi.start++;
  27.  
  28.                
  29.  
  30.                 }
  31.  
  32.                
  33.  
  34.                 NumeriPrimi.start=2;
  35.  
  36.  
  37.  
  38.         }
  39.  
  40.  
  41.  
  42. }
Parsed in 0.036 seconds, using GeSHi 1.0.8.4

in questo modo la prossima volta che avvii il programma il valore di start è ancora 2

(personalmente userei una variabile locale, ma non vorrei sconvolgerti troppo il codice.)
¯`·.¸¸.><((((º>¯`·.¸¸. ><((((º>
User avatar
qlimax
Master Developer
Master Developer
 
Posts: 271
Joined: Mon Aug 31, 2009 10:54 am
Location: Swiss

Postby neosephiroth86 » Fri Oct 02, 2009 5:37 pm

package com.examples.numeri;

public class Crivello implements Runnable {

public void run() {


//while(NumeriPrimi.start<NumeriPrimi.max/2){ //per ogni numero dobbiamo escludere i suoi multipli...

for (int i = 2; NumeriPrimi.start * i < NumeriPrimi.max; i++) {
NumeriPrimi.numeri[NumeriPrimi.start * i] = false;
}
NumeriPrimi.start=NumeriPrimi.start+2;

//}



}

}
---------------------------------------------------------------------------------------------------------------------------------
package com.examples.numeri;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class NumeriPrimi extends Activity {
/** Called when the activity is first created. */

public static int max = 5000;// il numero fino al quale voglio trovare i
// numeri primi
public static boolean[] numeri = new boolean[max];
public static int start = 2;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


for(int i=0;i<max;i++)
numeri[i]=true; // inizializziamo l' array

TextView tv = (TextView) this.findViewById(R.id.TextView01);

tv.setText("Waiting for numbers...");

TempoDesecuzione t = new TempoDesecuzione();
t.inizio();
Thread pari = new Thread(new CrivelloPari());
Thread uno = new Thread(new Crivello());
Thread due = new Thread(new Crivello());
Thread tre = new Thread(new Crivello());
pari.start();
while(start<max/2){uno.run();
due.run();tre.run();
}

try {
pari.join();
uno.join(); //Aspettiamo che il thread esca dal metodo run... in questo modo avremo un
//due.join(); //risultato ottimale, in quanto il crivello avrà escluso
//tre.join(); //tutti i non-primi
} catch (InterruptedException e) {

}
t.fine();
tv.setText(("\n" + t.durata() + " ms"));
t.reset();
start=2;
for (int i = 2; i < max; i++) {
if (NumeriPrimi.numeri[i]) {
String string = new String("Primo ");
tv.setText(tv.getText()+string+i+"\n");

}
}


}
}
----------------------------------------------------------------------------------------------------------------------------------
package com.examples.numeri;

public class CrivelloPari implements Runnable {

public void run() {

for (int i = 2; i < NumeriPrimi.max/2; i++) {
NumeriPrimi.numeri[NumeriPrimi.start * i] = false;
}
NumeriPrimi.start++;

}

}
----------------------------------------------------------------------------------------------------------------------------------
package com.examples.numeri;

public class TempoDesecuzione {
private long inizio;
private long fine;

public TempoDesecuzione() {
reset();
}

public void inizio() {
inizio = System.currentTimeMillis();
}

public void fine() {
fine = System.currentTimeMillis();
}

public long durata(){
return (fine-inizio);
}

public void reset() {
inizio = 0;
fine = 0;
}





}

Ciao!Ti ringrazio tantissimo per l'aiuto che mi hai dato,sono andato avanti nel progetto e adesso ho inserito codice che mi permette di capire il tempo necessario all'esecuzione,all'occorrenza disabilito uno o + thread per vedere se il tempo cambia.Ora,però,mi ritrovo con lo stesso problema dell'inizio e a cui non hai risposto col tuo reply al mio post originale,ovvero quello relativo alla avd.
Non riesco,infatti,a capire come vengono mappati questi thread sulla avd,se sono effettivamente in esecuzione parallela fra loro e fino a quanti ne posso creare!
Ci sarebbe un modo per virtualizzare la avd in modo di farle avere più core su cui gestire più thread?
Grazie
neosephiroth86
Freshman
Freshman
 
Posts: 4
Joined: Mon Sep 28, 2009 3:22 pm

Top

Return to Other Coding-Problems

Who is online

Users browsing this forum: Exabot [Bot], Google [Bot] and 15 guests