Permalänk
Medlem

Trådar i Java

Jag har en liten fundering som gäller trådar i JavaME.
Jag skall skapa en applikation där användaren skall kunna starta/stoppa olika tidtagarur.
Detta vill jag då göra med trådar.

Jag skapar en klass som då har till uppgift att bestämma start tiden:

public class run implements Runnable {
public static long tid1;

public void run() {

tid1 = System.currentTimeMillis();

}
}

I den andra klassen instansierar jag klassen, och skapar upp ett antal trådar.

curling1 = new Thread(new run());
curling2 = new Thread(new run());
curling3 = new Thread(new run());

Startar sedan trådarna

curling1.start();
curling2.start();
curling3.start();

Men jag kommer alltså inte att starta alla trådar på samma ställe vilket betyder att jag vill få ut de olika starttiderna. Jag vill alltså få ut värdet från variabeln tid1 vid de olika start tillfällena. Går det att göra på det viset?

Permalänk
Medlem

Men hur skall jag få ut de olika värdena ifrån variabeln tid1?
Jag vill alltså få ut varje enskild starttid i från varje tråd.

Permalänk
Medlem

System.out.println(tid1);

I din run class?

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem

Nej de olika starttiderna skrivs inte ut i run klassen, där finns endast:
public class run implements Runnable {
public static long tid1;

public void run() {

tid1 = System.currentTimeMillis();

}
}

I den andra klassen jag skapat tar jag alltså ut de olika värden jag får ifrån tid1. Men det jag inte förstår är hur jag skall få ut värdena ifrån de olika trådarna.

Permalänk
Medlem

Ok kan du inte bara göra:

curling1.tid1;
curling2.tid1;
curling3.tid1;

Då får du ut variabeln i dina curling klass, dock förstår jag inte varför du gör dem till trådar då de bara gör en sak vilket är att de sätter en tid... Kommer ändå som det ser ut nu att hända sekventiellt.

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem

Hur skall jag få ut variabeln på det viset?

Ja som det är nu kommer det hända sekventiellt, men de olika trådarna skall placeras i olika metoder. Applikationen skall alltså starta och stoppa de olika tidtagaruren när användaren själv vill, är därför jag vill använda mig utav trådar.

Permalänk
Medlem

Genom att använda
curling1.tid1 efter att du kört curling1.run kommer du få ut värdet som står i tid1 eftersom att run satte ett värde i variabeln tid1 för just den instansen av klassen run.

int tid1 = curling1.tid1;

så borde curling1's tid hamla i tid1 variablen i ditt main program som du sedan kan göra vad du vill med...

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem

Fungerar inte alls när jag försöker använda curling1.tid1, även fast jag kört run innan.

Permalänk
Medlem

Ett tag sedan jag satt i Java trodde det skulle fungera, måste dock sova nu.. Återkommer imorgon, får gräva fram mina böcker Ska dock gå att ta
class.variabel;
för att få värdet ur en klass...

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem
Skrivet av erdraug:

Ett tag sedan jag satt i Java trodde det skulle fungera, måste dock sova nu.. Återkommer imorgon, får gräva fram mina böcker Ska dock gå att ta
class.variabel;
för att få värdet ur en klass...

curling1 är ju en Thread inte en run

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem
Skrivet av erdraug:

Ett tag sedan jag satt i Java trodde det skulle fungera, måste dock sova nu.. Återkommer imorgon, får gräva fram mina böcker Ska dock gå att ta
class.variabel;
för att få värdet ur en klass...

Ska också få till lite sovning nu. Tack för all hjälp!

Permalänk
Medlem

För en enkel tidtagare som bara går att Starta och Stoppa (med nollställning) behöver du inga trådar.

public class Stoppur { private long start; public Stoppur() { reset(); } public void reset() { start = 0; start = getTimer(); } public long getTimer() { return System.currentTimeMillis() - start; } }

Varför behövs inga trådar?

När du skapar ett objekt av klass Stoppur tilldelas den privata medlemsvariabeln start tidpunken för objektets skapande. Det enda du behöver göra för att få fram hur länge objektet har existerat vid en godtycklig tidpunkt, är att jämföra denna starttid med nuvarande systemtid.

Det räcker egentligen med en lista med starttider för att tillgodose ditt behov. Klassen är med andra ord lite överflödig.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av matti4s:

curling1 är ju en Thread inte en run

Hans class heter run som implementerar Runnable vilket gör att hans run class blir en tråd men eftersom att det är en class borde han väl kunna komma åt variablerna inuti?

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem
Skrivet av erdraug:

Hans class heter run som implementerar Runnable vilket gör att hans run class blir en tråd men eftersom att det är en class borde han väl kunna komma åt variablerna inuti?

Nja. Det beror på om han har deklarerat curling1 som Thread curling1 eller run curling1.
I vilket fall som helst så är hans tid1-variabel static och delas mellan alla instanser av run (som egentligen borde hetat något helt annat eftersom 1: run är ett verb -- klassnamn brukar vara substantiv; och 2: konventionen säger att klassnamn bör börja med Stor Bokstav.)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Nja. Det beror på om han har deklarerat curling1 som Thread curling1 eller run curling1.

Jag har deklarerat curling1 som Thread curling1.

Skrivet av Teknocide:

För en enkel tidtagare som bara går att Starta och Stoppa (med nollställning) behöver du inga trådar.

public class Stoppur { private long start; public Stoppur() { reset(); } public void reset() { start = 0; start = getTimer(); } public long getTimer() { return System.currentTimeMillis() - start; } }

Varför behövs inga trådar?

När du skapar ett objekt av klass Stoppur tilldelas den privata medlemsvariabeln start tidpunken för objektets skapande. Det enda du behöver göra för att få fram hur länge objektet har existerat vid en godtycklig tidpunkt, är att jämföra denna starttid med nuvarande systemtid.

Det räcker egentligen med en lista med starttider för att tillgodose ditt behov. Klassen är med andra ord lite överflödig.

Tack så mycket för hjälpen. Men jag läser nu en kurs i Java ME där jag måste skapa applikationen med hjälp utav trådar.

Permalänk
Medlem

Nvm det jag skrivit testade det nu funkar ju icke :/

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem

Ingen som har en lösning på detta? Vill gärna veta själv nämligen

Visa signatur

| CPU: Intel Core i5 3570K | Mobo: MSI Z77A-GD65 ATX | Ram: Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE | GFX: Gigabyte HD7970 OC 3GB | SSD: Corsair Force 3 120GB | HDD: Diverse Mekaniska 4TB | Chassi: Corsair 800D | PSU: Corsair AX 850W 80+ Gold Modulär | CPU Cooler: Corsair H50 |
Citera mig så hittar jag tillbaka hit :)

Permalänk
Medlem
Skrivet av erdraug:

Ingen som har en lösning på detta? Vill gärna veta själv nämligen

Publika variabler har direktåtkomst precis som du sa:

class Foo { public int bar = 42; } ... Foo foo = new Foo(); System.out.println(foo.bar); // skriver 42

Detta löser dock inte OPs uppgift, då objekt av run tack vare static-nyckelordet delar EN tid1-variabel, oavsett hur många objekt som skapas.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

#971621 - Pastie

Där har jag gjort ett objekt, Timer, som ärver av Thread. Det enda som görs i run är att skapa ett Date objekt (som innehåller info om när det skapades).

I main skrev jag lite kod för att visa att det faktiskt funkar. Värt att tänka på är att även fast objektet har kört sin run och är i ett "dött" läge så kan du komma åt dess data.

Visa signatur

AMD 5700X@Vatten | asus prime x370pro | Asus 2080 Strix | 2x16GB Kingston Fury Renegade RGB DDR4 3.6GHZ | Lian Li O11d EVO + 2x240 EKWB RAD + 6 Lian Li AL120 | CoolerMaster V850 | NVME 2TB Seagate Firecuda 510 + NVME 1TB WD BLACK + 3 SSD | Samsung Odyssey 49" G9| DELL 2713HM | Varmilo VA69 Clear/brown | Logitech G502 2016.

Phenom X6 1045T | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Gigabyte ma785gmt-us2h | Silverstone Temjin 08 | Corsair VX450

Permalänk
Medlem
Skrivet av DeluxXxe:

#971621 - Pastie

Där har jag gjort ett objekt, Timer, som ärver av Thread. Det enda som görs i run är att skapa ett Date objekt (som innehåller info om när det skapades).

I main skrev jag lite kod för att visa att det faktiskt funkar. Värt att tänka på är att även fast objektet har kört sin run och är i ett "dött" läge så kan du komma åt dess data.

Din kod fungerar lika bra om Timer inte är en subklass till Thread. Det finns ingen mening med att göra som du gjort.

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem
Skrivet av matti4s:

Din kod fungerar lika bra om Timer inte är en subklass till Thread. Det finns ingen mening med att göra som du gjort.

Men nu sade ju TS att han ville lösa det med trådar.

En annan lösning som kanske är lite roligare:
#972294 - Pastie

Och till ts:
Som redan nämnt ligger ditt problem i att du använder en statisk variabel. Det gör att alla instanser av typen "run" (som din klass heter) kommer dela på variabeln och i det fallet så kommer ju alla instanser av "run" rapportera starttid från din senast startade instans.

Visa signatur

AMD 5700X@Vatten | asus prime x370pro | Asus 2080 Strix | 2x16GB Kingston Fury Renegade RGB DDR4 3.6GHZ | Lian Li O11d EVO + 2x240 EKWB RAD + 6 Lian Li AL120 | CoolerMaster V850 | NVME 2TB Seagate Firecuda 510 + NVME 1TB WD BLACK + 3 SSD | Samsung Odyssey 49" G9| DELL 2713HM | Varmilo VA69 Clear/brown | Logitech G502 2016.

Phenom X6 1045T | Corsair TWIN2X PC6400C4DHX 2x2GB + Crucial Ballistix Sport 2x2GB | Gigabyte ma785gmt-us2h | Silverstone Temjin 08 | Corsair VX450