Kirjoittaja Aihe: Rinnakkaisuusongelmaan liittyvä lukkiutumisen esto-algoritmistä  (Luettu 6707 kertaa)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Luin kertauksen vuoksi täsäs ajan kuluksi "Aterioivat Filosofit" -ongelman Wikipediasta, joka on tietojenkäsittelyssä rinnakkaisuuteen liittyvä ongelma, joka on esitetty 1960-luvulla ensimmäisen kerran.

Onko palstalaisilla jollakulla koklemusta ohjelmistopatenteista? Ainakin istuva tasavallan presidentti Sauli Niinistö on puhunut joskus EU-tasolla niiden puolesta, että tietokone-ohjelman tai algoritminkin voisi patentoida. Itselleni tuli Helsingin solukämppä vuosinani, kun Sale haki ensimmäisen kerran valtuutusta presidentin töihin kansalta, hänen johonkin bileisiinsä kutsu postissa, mutta se ei liity nyt ohjelmistopatenttiin.

Ajattelin, että jos kehittäisi algoritmin, joka estää tuossa rinnakkaisuusongelmassa lukkiutumisen (deadlock) jotenkin yleisellä tasolla, olisiko mahdollista hakea pantettina siihen patentti-ja rekisterikeskukselta?

Katselin tuossa netissä hakukoneella, niin löysin tuollaisen, kuin "Banker's Algorithm", oikein muita ei löytnyt, jota käytetään tuon deadlockin välttämiseen.

Säikeisiin liittyvää ohjelmointia taitaa olla tiedossa?
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Voisiko joku tästä Testi-Java luokasta sanoa, mikä mättää, kun tulosteessa kerrotaan, että ainoastaan yksi säie on hengissä.
Ohjelmakoodi
Koodia: [Valitse]
import java.util.*;

public class Testi {

private static String[] nimet = {"Jere", "Ilkka","Tino"};
private static ArrayList<Thread> saikeet = new ArrayList<Thread>();

public Testi() {
for (int x=0;x<nimet.length;x++) {
saikeet.add(new Thread(nimet[x]));
}
startThreads();
count();

}

public void startThreads() {
for (int x=0;x<saikeet.size();x++) {
saikeet.get(x).start();

}
}

public void count() {
int alive = 0;

for (int x=0;x<saikeet.size();x++) {
Thread wT = saikeet.get(x);
if (wT.isAlive()) {
alive++;
System.out.println("Säie nimeltä " +wT.getName()+ " (ID - " +wT.getId() +") on hengissä!");
}
}

System.out.println("Säikeitä kaiken kaikkiaan olemassa: " +saikeet.size() + ", joista elossa: " +alive +" ja kuolleita: " +(saikeet.size()-alive));
}
public static void main (String[] args) {
Testi app = new Testi();

}
}

Ohjelman kun ajaa konsolissa, tuloste on seuraava, joka kertoo, että noita kahta säiettä ei ole käynnistetty ollenkaan, jotka kosntruktorissa käynnistetään. En löydä virhettä koodista. Voisiko joku auttaa?

Tuloste ohjelmaa ajettaessa:
Koodia: [Valitse]
Säie nimeltä Jere (ID - 10) on hengissä!
Säikeitä kaiken kaikkiaan olemassa: 3, joista elossa: 1 ja kuolleita: 2
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
En nyt pääse kokeilemaan koneella, mutta veikkaan, että muut säikeet eivät ole ehtineet käynnistyä siinä vaiheessa, kun count-metodia kutsutaan.

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vaikka Thread:t on luotu ja käynnistetty ne eivät ikinä tee mitään koska niiden run() metodia ei ole määritelty/ylikirjoitettu.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Aika metkaa. Vaikka run() -metodia ei olekaan ylikirjoitettu, pitäisi mielestäni kaikki säikeet silti olla ajossa tai hengissä, kun tuossa startThreads -metodissa kutsutaan tuota -start() -metodia, joka viittaa kysesen Thread-luokan ilmentymää for-toistosilmukassa . Silti ensimmäisen 0-alkion "Jere" -niminen säie ilmoitetaan ainoastaan elolliseksi, vaikka sekään tee mitään. Eikö kaikki kolme säiettä pitäisi olla tasavertaisia?

Aloitin Java - projektin nimeltä "DeadlockPrevention", ja tämä testi-luokka nyt on lähinnä tutustumisa Java APIn Thread-luokkaan, mutta Githubissa voisi julkaista Banker's Algoritmin Java -esityksen. GeeksforGeeks -sivustolla on ihan havainnollistava esitys tuosta lukkiutumisen välttämisestä.
https://www.geeksforgeeks.org/deadlock-prevention/

Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vaikka käyttää tuota Thead-luokan run()-metodia sen jälkeen, kun ensin on start() -metodia kutsuttu, tilanne ei muutu miksikään.

Muutin startThreads() -metodin seuraavanlaiseksi
Koodia: [Valitse]
public void startThreads() {
for (int x=0;x<saikeet.size();x++) {
Thread temp = saikeet.get(x);
temp.start();
temp.run();

}
}

En tiedä, jos kokeilisi ohjelmoida oman Säie-tietotyypin kullekin säikeelle, jossa määrittelee tietotyypin otsikkorivissä toteuttamaan Runnable -luokan, ja määrittelee sitten kyseisessä luokassa run() -metodin itse, muuttuuko tilanne miksikään. Sitä kokeilen seuraavaksi.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Kokeilin tuota omn saie-luokan määrittelyä, niin nyt tuli ulostulo-tulosteena konsolissa, että kaikki 3 säiettä käynnistyi, mutta 2 elossa, ja yksi kuollut, vaikka missään vaiheessa yhtäkään säiettä ei ohjelmakoodissa eliminoida tai tapeta ajosta.
Koodia: [Valitse]
Säie Jere käynnistyi! (ID - 11)
Säie Ilkka käynnistyi! (ID - 12)
Säie Tino käynnistyi! (ID - 13)
Säikeitä elossa: 2 - Kuolleita: 1

Nyt koodini näyttää seuraavalta:
Koodia: [Valitse]
import java.util.*;

public class Testi  {

private static String[] nimet = {"Jere", "Ilkka","Tino"};
private static ArrayList<FooThread> saikeet = new ArrayList<FooThread>();

public Testi() {
for (int x=0;x<nimet.length;x++) {
saikeet.add(new FooThread(nimet[x]));
}
countActives();
}

public void countActives() {
int active = 0;
FooThread temp = null;
for (int x=0;x<saikeet.size();x++) {
temp = saikeet.get(x);
if (temp.isActive()) {
active++;
}
}
System.out.println("Säikeitä elossa: " +active +" - Kuolleita: " +(saikeet.size()-active));
}

public static void main (String[] args) {
Testi app = new Testi();

}
}

Tuo FooThread -luokka, jossa toteutetaan run-metodi, näyttää seuraavalta:
Koodia: [Valitse]
public class FooThread implements Runnable {

//Properties and Attributes
private static Thread saie;
private boolean active;

//Parameter Constructor
public FooThread(String name) {
this.saie = new Thread(name);
this.saie.start();
this.run();
}

//implementig run

public void run() {
String name = this.saie.getName();
long id = this.saie.getId();
System.out.println("Säie " +name +" käynnistyi! " +"(ID - " +id +")");
this.active = this.saie.isAlive();
}

//Setters and Getters
public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}

}

Tämä perusteet tästä säie-ohjelmoinnista pitäisi mennä jakeluuni ennen, kuin alkaa jotain järkevää ohjelmointia suunnittelemaan näiden säikeiden käsittelyn ympärille. Vieläkin tässä jokin mättää.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Menee nyt vähän norsunluu-tutkimukseksi, mutta sekin kävi mielessä, että missä vaiheessa Javan roskienkeruu-operaatio (Garbage Collector) mahtaa poistaa noita säikeitä muistista onkohan se heti kun säikeen toiminta on päättynyt. Javan anatomiasta niin paljon tietoa.

Jos ajatellaan, että ohjelmoidaan jotain pankkijärjestelmää, ja jos sen pankki-transaktion ajattelee säikeenä, esim. tilisiirto "Ilkka tekee 50 euron tilisiirron Jerelle", niin ensin tarkistetaan Ilkan tilin saldo, ja jos kate on kunnossa, sieltä vähennetään 50, ja sitten lisätään Jeren saldoon 50. Pankeillakin on vuorokaudessa tuhansia tilisiirtoja, niin pitää olla joku järjestelmä, missä hallinnoidaan muistiresursseja ja nopeuskin on aika kriittinen arvo.

Onkohan jossain ohjelmointikielessä sisäänrakennettuna jonkinlaista resurssien hallinnointimekanismia vähän tuon Javan roskienkeruun tapaan. Periaatteessa välimuistista voi poistaa sitten tuon tilisiirto-transaktion tiedon sen jälkeen, kun finanssidata on tupattu tietokantaan, sen jälkeen tiedot on saatavilla sieltä, niin välimuistissa niitä ei välttämättä tarvitse säilyttää enää.

Ennen koronaa tietokanta-kurssilla jonkin verran puuhasin JSON-datan tuottamiseen liittyvän ohjelmakoodin  parissa sen tuppaamiseen SQL-tietokantaan, käytin org.JSON-kirjastoa, jonka saa ladattua osoitteesta https://jar-download.com/artifacts/org.json niin siinäkin olisi jouten aikaa jos on, niin sovellskehityksen paikka, joka HTML-lomakkeen tiedot tuppaa JSON-muodossa tietokantaan.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Tämä perusteet tästä säie-ohjelmoinnista pitäisi mennä jakeluuni ennen, kuin alkaa jotain järkevää ohjelmointia suunnittelemaan näiden säikeiden käsittelyn ympärille. Vieläkin tässä jokin mättää.

Sen lisäksi että perusteet säie-ohjelmoinnista on hyvä kerrata ensin myös java/oo-ohjelmoinnin perusteet mitä tarkoittaa perintä ja sen suhteen mikä ero on luokka- ja instanssi muuttujalla, nyt tuossa FooThread luokassa niitä on oudolla tapaa käytetty:

    private static Thread saie;


Lisäksi koska FooThread itse jo toteuttaa Runnablen (= säie) ei sen sisällä tarvitse luoda turhaa Threadia ja käynnistää sitä tekemään saman ei mitään kuin alkuperäisessa versiossa.

Sitten on harhaanjohtavaa "yli kirjoittaa" metodeita eri nimellä niin että niiden käytöstä saa väärän kuvan. Voi ihan suoraan kutsua FooThread instanssin isAlive() metodia sen sijaan että kutsuisi isActive(). active/alive ovat eri asioita eikä niitä kuulu tuolla tapaa nimetä väärin ja sotkea.

Nyt tuo toteutus ei aja omana säikeenä ollenkaan FooThread luokan instansseja vaan:

1) Luodaan FooThread instanssi

2) Tämän constructorissa luodaan turha säie joka käynnistetään ja ei tee mitään

3) Kutsutaan constructorissa luodun instanssin run() metodia.

Tämä kaikki tapahtuu ohjelman main-thread toimesta.

« Viimeksi muokattu: 01.06.20 - klo:08.30 kirjoittanut _Pete_ »

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Joo, no toi static -avainsana rikkoo tiedon kapselointi-periaatetta tietotyyppiä määrittäessä. Lisäksi turvallisuusriski, kun staattisiin attribuutteihin pääsee käsiksi suoraan ulkopuoliset ja arvot voi sitten olla mitä on.

Ehkä tuossa kesäyön hämärinä tunteina viihteellä kun olin aiemmin illalla, niin aivot ihan maksimiteholla pyörinyt koodin tuottamisen suhteen. On tosiaan valuvirhe tuossa koodissa monta seikkaa.

Tuossa avauksessa, kun tiedustelin, että onko jollakulla foorumilaisella ohjelmistopatenteista kokemusta, niin lähetin kysymyksen siitä Patentti-ja rekisterihallitukselle, niin sieltä tuli ystävällisin terveisin vastaus, että vaikka Suomessa on ohjelmistopatentti mahdollinen, niin jonkin yksittäisen algoritmin patentointi on kaksipiippuinen asia, kyllä ja ei oli vastaus, esimerkiksi jotain matemaattista ongelmaa ratkaiseva algoritmi ei ole patentoitavissa, vaan algoritmin pitää liittyä jonkin konkreettisen järjestelmän toimintaan edesauttavasti, tai pitää esittää patenttihakemuksessa tarkka kuvaus tai ainakin siihen tulisi liittää se toiseen koneeseen esimerkiksi tietokoneeseen liitettynä.

Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vielä tuosta patentista lisenssoinnista, että järkevin 1-2 miehen IT-talon liiketoiminta-malli lienee se, jos sattuu johonkin ohjelmointiongelmaan jollain sektorilla kehittämään jotain uutta, mikä on erittäin haastavaa esimerkiksi joskus vuosikymmeniä sitten esitettyyn ohjelmointiongelmaan, niin perustaa osakeyhtiön, joka hallinnoi sitä patenttia, eikä tarvitse lähteä koko järjestelmää myymään.

Vaikka pystyisi toimittamaan jonkin järjestelmän, niin ongelmia tulee siinä, kun työkokemukseni on lähinnä julkisen sektorin hallinto ja koulutuspuolelta, kun esimerkiksi Turun kaupunki päättää investoida johonkin uuteen tietojärjestelmään, järjestelmäntoimittaja kilpailutetaan, ja lain mukaan se tarjouskilpailu on tosin avoin ja julkinen, mutta kokemus osoittaa, mitä olen tuota hallintosekoilua seurannut, niin pienillä toimijoilla ole mitään jakoa saada sitä toimitussopimusta. Yleensä päätös on se, että edullisin valitaan, ja isot ohjelmisto/järjestelmätoimittajat pystyvät tarjoamaan koko tietojärjestelmän elinkaaren ja niillä on jo aiempia referenssejä, niin helposti ymmärrettävissä, että valinta kohdistuu sellaisiin toimijoihin. Tästäkin on puhuttu, mitä olen vasemmistoliiton pienyrittäjätyöryhmässä jäsenenä nyt vuonna 2020, että tähän pienten toimijoiden jonkinlaiseen sortamiseen tulisi jotain muutosta tapahtua.

Tuollaisessa liiketoimintamallissa, missä hallinnoidaan sitä ohjelmistopatenttia, patentin haku ja ylläpitäminen maksaa jotain rahaa, ja sitten palkataan asianajaja, joka ymmärtää lisenssisopimuksien lakitaustan, se maksaa, ja tulot muodostuu sitten noista lisenssimaksuista tai sitten yritys pyörii niin kauan tappiollisena, että joku on kiinnostunut siitä patentista niin paljon joku isompi toimija, että on kiinnostunut ostamaan yrityksen ulos markkinoilta, kun patentti tuottaa lisäarvoa yritykselle, niin alkuperäinen perustaja nettoaa sitten yrityskaupoista jonkun miljoonan, kun kaupan hinta on sitten niin suuri, että se kattaa kaikki aiemmat kustannukset ja sitten pitäisi saada vielä voita leivän päälle joksikin aikaa, niin ei sitä millään eurolla kahdella myydä sitten tietenkään kenellekään.

Tetriksestä, kun pidän, sehän on hyvä esimerkki, kun Tetris Holding Companylla, jossa on yhtenä perustajana ollut Tetriksen alkuperäinen venäläinen tietokoneinsinööri, niin yhtiöllähän on Tetris-algoritmi-patentti Yhdysvalloissa, ja juuri eilen luin artikkelin netistä, että 15 vuotta takaperin eräs mobiilipepeljä valmistava yritys oli maksanut Tetris-lisenssistä 135 miljoonaa taalaa, ja se kattoi seuraavat 15 vuotta kaikki Tetris Holding Companyn Tetris-oikeudet, mitä yritys hallinnoi. Tetriksestä kannattaa pitää.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Tämä perusteet tästä säie-ohjelmoinnista pitäisi mennä jakeluuni ennen, kuin alkaa jotain järkevää ohjelmointia suunnittelemaan näiden säikeiden käsittelyn ympärille. Vieläkin tässä jokin mättää.

Sen lisäksi että perusteet säie-ohjelmoinnista on hyvä kerrata ensin myös java/oo-ohjelmoinnin perusteet mitä tarkoittaa perintä ja sen suhteen mikä ero on luokka- ja instanssi muuttujalla, nyt tuossa FooThread luokassa niitä on oudolla tapaa käytetty:

    private static Thread saie;


Lisäksi koska FooThread itse jo toteuttaa Runnablen (= säie) ei sen sisällä tarvitse luoda turhaa Threadia ja käynnistää sitä tekemään saman ei mitään kuin alkuperäisessa versiossa.

Sitten on harhaanjohtavaa "yli kirjoittaa" metodeita eri nimellä niin että niiden käytöstä saa väärän kuvan. Voi ihan suoraan kutsua FooThread instanssin isAlive() metodia sen sijaan että kutsuisi isActive(). active/alive ovat eri asioita eikä niitä kuulu tuolla tapaa nimetä väärin ja sotkea.

Nyt tuo toteutus ei aja omana säikeenä ollenkaan FooThread luokan instansseja vaan:

1) Luodaan FooThread instanssi

2) Tämän constructorissa luodaan turha säie joka käynnistetään ja ei tee mitään

3) Kutsutaan constructorissa luodun instanssin run() metodia.

Tämä kaikki tapahtuu ohjelman main-thread toimesta.

Tein muutoksia koodiin, ja nyt siinä pitäisi olla mitään epäselvää ja nyt FooThread -luokkakin toteuttaa tiedon kapselointi -periaatetta (Data Encapsulation). tosin toString() -metodia ei ole ylikirjoitettu, vaikka tavallisesti se pitäisi kai ylikirjoittaa.

Nimesin TestiB--luokaksi yksinkertaistetun -version, ja se näyttää nyt tältä:
Koodia: [Valitse]
import java.util.*;

public class TestiB  {

private static String[] nimet = {"Jere", "Ilkka","Tino"};
private static ArrayList<FooThread> saikeet = new ArrayList<FooThread>();

public TestiB() {
for (int x=0;x<nimet.length;x++) {
saikeet.add(new FooThread(nimet[x]));
}
countActives();
}

public void countActives() {
int active = 0;
FooThread temp = null;
for (int x=0;x<saikeet.size();x++) {
temp = saikeet.get(x);
if (temp.getSaie().isAlive()) {
active++;
}
}
System.out.println("Säikeitä elossa: " +active +" - Kuolleita: " +(saikeet.size()-active));
}

public static void main (String[] args) {
Testi app = new Testi();

}
}

FooThread -luokkaa yksinkertaistin, ja poistin tuon run()-metodin luokassa toteuttamisen, ja poistin Thread -tyyppisen säie-luokan attribuutin staattisesta tavalliseksi luokkaattribuutiksi. Tosiaan Thread-luokkahan, kuten totesit, toteuttaa tuon run()-metodin, ja siihen pääsee käsiksi, kun setters/getters -metodeihin lisää tuon Thread-ilmentymän saantimetodin.

Koodia: [Valitse]
public class FooThread  {

//Properties and Attributes
private Thread saie;

//Parameter Constructor
public FooThread(String name) {
this.saie = new Thread(name);
this.saie.start();

}

//Setters and Getters


public Thread getSaie() {
return saie;
}

public void setSaie(Thread saie) {
this.saie = saie;
}
}

Taas avoin kritiikille tässä perus-säie-casessa. Nyt Java- semantiikka on kohdallaan ilman mitään epäselvyyksiä?

Nythän ilman mitään ylimääräisiä sekoiluja kaikki säikeet ovat käynnissä, kuten konsolitulostekin ilmoittaa:
Koodia: [Valitse]
Säie nimeltä Jere (ID - 10) on hengissä!
Säie nimeltä Ilkka (ID - 11) on hengissä!
Säie nimeltä Tino (ID - 12) on hengissä!
Säikeitä kaiken kaikkiaan olemassa: 3, joista elossa: 3 ja kuolleita: 0
« Viimeksi muokattu: 02.06.20 - klo:08.49 kirjoittanut Jere Sumell »
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Joo, no toi static -avainsana rikkoo tiedon kapselointi-periaatetta tietotyyppiä määrittäessä. Lisäksi turvallisuusriski, kun staattisiin attribuutteihin pääsee käsiksi suoraan ulkopuoliset ja arvot voi sitten olla mitä on.

static ei liity kapselointiin mitenkään vaan siitä vastaa public/protected määritykset.

Pitää siis selvittää mikä ero on luokka muuttujalla (=static) vs luokan INSTANSSI muuttujalla.

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili

Taas avoin kritiikille tässä perus-säie-casessa. Nyt Java- semantiikka on kohdallaan ilman mitään epäselvyyksiä?

Nythän ilman mitään ylimääräisiä sekoiluja kaikki säikeet ovat käynnissä, kuten konsolitulostekin ilmoittaa:

Koodia: [Valitse]
Säie nimeltä Jere (ID - 10) on hengissä!
Säie nimeltä Ilkka (ID - 11) on hengissä!
Säie nimeltä Tino (ID - 12) on hengissä!
Säikeitä kaiken kaikkiaan olemassa: 3, joista elossa: 3 ja kuolleita: 0


Uudessa TestiB:ssä edelleen käytetään vanhaa Testi luokkaa.

Ja Threadit eivät vieläkään oikeasti tee mitään. Se että ne näkyy olevan hengissä johtuu siitä että eivät ole ehtineet luonnin - tyhjän run()  kutsumisen jälkeen vielä kuolemaan ja tulleet siivotuksi pois

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Joo, no se on selvää ollut alusta asti itsellenikin, että mitään ei säikeet tee elossa kituuttelun lisäksi, siinä mielessä tämä Testi-luokan ohjelma on typerä, tiedä mitä arvoa tällä ole mitään muuta, kuin ajankuluksi tutustutaan Thread-luokan perusteisiin.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi

Taas avoin kritiikille tässä perus-säie-casessa. Nyt Java- semantiikka on kohdallaan ilman mitään epäselvyyksiä?

Nythän ilman mitään ylimääräisiä sekoiluja kaikki säikeet ovat käynnissä, kuten konsolitulostekin ilmoittaa:

Koodia: [Valitse]
Säie nimeltä Jere (ID - 10) on hengissä!
Säie nimeltä Ilkka (ID - 11) on hengissä!
Säie nimeltä Tino (ID - 12) on hengissä!
Säikeitä kaiken kaikkiaan olemassa: 3, joista elossa: 3 ja kuolleita: 0


Uudessa TestiB:ssä edelleen käytetään vanhaa Testi luokkaa.

Ja Threadit eivät vieläkään oikeasti tee mitään. Se että ne näkyy olevan hengissä johtuu siitä että eivät ole ehtineet luonnin - tyhjän run()  kutsumisen jälkeen vielä kuolemaan ja tulleet siivotuksi pois

Joo, Sama Testi - luokkahan siinä leikepöydältä pohjaksi tuli copy-pastella. Muutin ainoastaan tuon isActive()-poiston ja lasken vielä hengissä olevat prosessit suoraan tuon Thread-tyyppisen ilmentymän isAlive()-metodia käyttämällä, kuten tässä oli kommentteissa koodistani.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Joo, Sama Testi - luokkahan siinä leikepöydältä pohjaksi tuli copy-pastella. Muutin ainoastaan tuon isActive()-poiston ja lasken vielä hengissä olevat prosessit suoraan tuon Thread-tyyppisen ilmentymän isAlive()-metodia käyttämällä, kuten tässä oli kommentteissa koodistani.

Sitä juuri tarkoitin että on sellainen copy/paste tyylinen ratkaisu joka sattuu toimimaan vahingossa. TestiB luokan main() luodaan instanssi vanhasta Testi luokasta ja sen koodi suoritetaan eikä ollenkaan TestiB luokan koodia.


Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Joo, Sama Testi - luokkahan siinä leikepöydältä pohjaksi tuli copy-pastella. Muutin ainoastaan tuon isActive()-poiston ja lasken vielä hengissä olevat prosessit suoraan tuon Thread-tyyppisen ilmentymän isAlive()-metodia käyttämällä, kuten tässä oli kommentteissa koodistani.

Sitä juuri tarkoitin että on sellainen copy/paste tyylinen ratkaisu joka sattuu toimimaan vahingossa. TestiB luokan main() luodaan instanssi vanhasta Testi luokasta ja sen koodi suoritetaan eikä ollenkaan TestiB luokan koodia.

Hyvä "_Pete", että olet tarkka, sattumalta meni ohi itseltä tuo. Pitäisi luoda TestiB -ilmentymä. Korjasin koodin, ja ohjelma toimii oikein, vaikka ei mitään järkevää säikeiden toimintaan olekaan ohjelmoitu.

Koodia: [Valitse]
Kaikkien säikeiden lukumäärä 3 Säikeitä elossa: 3 - Kuolleita: 0

Lopullinen TestiB-koodi

Koodia: [Valitse]
import java.util.*;

public class TestiB  {

private static String[] nimet = {"Jere", "Ilkka","Tino"};
private static ArrayList<FooThread> saikeet = new ArrayList<FooThread>();

public TestiB() {
for (int x=0;x<nimet.length;x++) {
saikeet.add(new FooThread(nimet[x]));
}
countActives();
}

public void countActives() {
int active = 0;
FooThread temp = null;
for (int x=0;x<saikeet.size();x++) {
temp = saikeet.get(x);
if (temp.getSaie().isAlive()) {
active++;
}
}
System.out.println("Kaikkien säikeiden lukumäärä " +saikeet.size() +" Säikeitä elossa: " +active +" - Kuolleita: " +(saikeet.size()-active));
}

public static void main (String[] args) {
TestiB app = new TestiB();

}
}

Tietokoneissa mikään toimi vahingossa tai ainakaan ilman, miten ohjelmoija on määritellyt koodiin. Nyt tässä esimerkissä ei ole vanhgossa toimivuuden ikeetä, josta päätyisi jalkapuuhun tai hirteen.
« Viimeksi muokattu: 02.06.20 - klo:12.18 kirjoittanut Jere Sumell »
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Tässä minun käsitykseni patenteista:

Pienyritys tarvitsee patenttia suojatakseen sijoitusta, joka tarvitaan teollisen valmistuksen käynnistämiseen ja markkinoille pääsyyn. Kun tuotanto pyörii ja kauppa käy, patentin ylläpitoon ei enää kannata panostaa. Isossa yrityksessä mukana on muitakin motiiveja. Ison patenttisalkun avulla voidaan pelata nokkapokkaa eli uhitella, diivailla ja käydä kauppaa kilpailijoiden kanssa. Ja kun vakuutusmatematiikkaa muistuttavalla menetelmällä lasketaan millä palkkasummalla minkäkin suuruinen t&k-henkilöstö pystyy tuottamaan kilpailukykyä, yhtenä henkilöstön mittarina tässä laskennassa käytetään osakesalkkua.

Yksityiselle ihmiselle patentti on arvokas vain jos joku muu on valmis maksamaan patentista suojatakseen sijoituksia valmistukseen.

Jos keksintö ei koske valmistusta, ei ole mitään syytä olettaa että kukaan maksaisi keksinnöstä patenttimaksuja. Tekijänoikeusmaksuja voi kyllä odottaa, mutta patentti on mielekäs vain valmistuksen yhteydessä. Jos keksit mielestäsi hienon algoritmin, voit yrittää vaatia koodistasi tekijänoikeusmaksua. Jos keksit mielestäsi hienon tavan valmistaa jotain tuotetta tai tehostaa jotakin valmistuksen yksityiskohtaa siten, että valmistus on helpompaa ja halvempaa tai valmistettava tuote on jotenkin parempi kuin mikän muu, voit yrittää rekisteröidä patentin.

Keksintö joka perustuu puhtaasti ohjelmakoodiin on aina matematiikkaa, eikä matematiikka Euroopasa voi patentoida.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Olen tänään vähän käyttänyt aikaa säikeiden parissa työskentelyyn.

Pistin Dropboxiin jakoon päivän tuotokseni pienen pankkisimulaattorin, jossa lähestymistapana on asiakkaan ja pankkitransaktion käsittäminen säikeenä.
Readme-tiedostossa tarkemmat kuvaukset.

Suora linkki Dropbox-jakooni on
https://www.dropbox.com/sh/njgchl6ym67sqwc/AAAygWRXRcHw-1d8VJ9xASmQa?dl=0
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)