Siden ser jo helt smashing ut, men det koker ned til det samme spørsmålet som sist; hvorfor bruke en liten markedsplass med lite utvalg istedenfor en stor med godt utvalg? Tror ikke det vil fly, men lykke til. Edit: Og husk at det som kjennetegner de som har lykkes er at de først har mislykkes mange ganger, uten å gi opp.
Java har if-then-else hvis det der det du lurer på. Og case-switch.
"Vinduer" også, og en hel del andre avanserte greier. Skal du lage programmer med grafisk brukergrensesnitt har du flere alternativer. Først Awt, som vel er utdatert i dag. Deretter Swing som du kan bruke til å lage plattformnøytrale gui, dvs. de ser "like" ut uansett om du kjører på Windows, X11 eller noe annet. Netbeans og IntelliJ bruker Swing, til sitt eget GUI. Eclipse bruker sitt eget system, kalt SWT, som baserer seg mer på å bruke det underliggende grafikksystemet. SWT kan du også bruke til dine egne applikasjoner. Da er en knapp en Windows-knapp i Windows og en X11-knapp i X11 og ser ut deretter. Siste tilskudd på stammen heter JavaFX, og er ment å ta over for Swing. FX er markup-basert, slik at du kan utforme selve gui i et xml-basert språk (a'la html). De fleste java-programmer har webgrensesnitt i dag, så man skal tenke seg om to ganger før man bestemmer hva man vil bruke. Standarden for webgrensesnitt heter JSF, men det fins mange gode alternativer, f.eks. Vaadin. Trenden peker dog mot javascript-baserte løsninger, som React og AngularJS.
Bibliotekfiler har java mange av. Java har noe vi kaller et "økosystem", som består av alle biblioteker, rammeverk, applikasjonstjenere, JVM-baserte alternative programmeringsspråk mv. som kan brukes på JVM. Det er grenseløst vanskelig å holde orden på alt dette uten hjelp, og det er der dette med prosjekthåndtering kommer inn. Industristandarden i dag kalles Maven. Veldig kort fortalt bygger maven på en prosjektfil kalt pom.xml (Project Object Model), og i tillegg en god del predefinert kunnskap om hvordan forskjellige java-programmer skal bygges opp, kompileres og pakkes sammen. Her er det mye automatikk inne i bildet, f.eks. blir alle biblioteker automatisk lastet ned for deg, inklusive andre biblioteker de bibliotekene du vil bruke, avhenger av.
Maven er som nevnt godt integrert med de tre mest brukte ide'ene for Java, og kan også brukes fra kommandolinja. IntelliJ har til og med sin egen Maven integrert, men den er ofte litt utdatert. Du kan installere nyere versjon fra maven.apache.org eller installere via Homebrew (siden jeg tror du bruker Mac). Det kan være lurt, siden det ofte er praktisk å kjøre Maven fra kommandolinja (f.eks. når du vil klippe og lime inn kommandoer som nedenfor ... da er det knotete å måtte oppgi stiveien til IntelliJ's egen Maven hver gang, selv om det går an).
Installer først Homebrew:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Deretter installerer du Maven:
$ brew install maven
Du kan installere jdk og veldig, veldig mange andre programmer også på denne måten (inklusiver Oracle Java). Når du har gjort dette har du en Maven home-katalog i
/usr/local/Cellar/maven/3.3.9/libexec
og en eksekverbar link i
/usr/local/bin/mvn
Maven har en konstruksjon kalt arketyper som gjør det enkelt å sette opp et prosjekt basert på en prosjektmal. For å lage og kjøre en enkel web-app prøv:
$ mvn -B archetype:generate -DarchetypeGroupId=com.vaadin -DarchetypeArtifactId=vaadin-archetype-application -DarchetypeVersion=7.7.1 -DgroupId=org.test -DartifactId=vaadin-app -Dversion=1.0-SNAPSHOT
$ cd vaadin-app
$ mvn package jetty:run
Ta så en titt i browseren på
http://localhost:8080/
I katalogen vaadin-app vil det ligge en fil kalt pom.xml. Denne kan du åpne med IntelliJ og titte på. Den er _nesten_ selvforklarende.
Du kan stoppe det hele med Crtl-C.
Alt i alt er det litt hårete å begynne å lage web-applikasjoner når man er helt fersk, så dette var bare ment å illustrere fordelen med Maven. Hvis du vil lagen en enkel hello-world-applikasjon med maven kan du bruke kommandoen
$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
$ cd my-app
bygg
$ mvn package
og kjør
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Pom-fila som blir generert i dette tilfellet ser sånn ut
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Pom-filer kan man godt skrive for hånd, kopiere fra ett prosjekt til et annet osv. Avhengigheten til noe som kalles junit linker inn et testrammeverk. Å kjøre tester er en integrert del av maven-byggeprosessen, men det er helt frivillig å ha med testrammeverk og tester. Når du brukte quickstart-arketypen fikk du med en test på kjøpet. Den kan kjøres med kommandoen
$ mvn test
Mer info på
https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
Kan ikke si at det er min erfaring. Til tider har jeg brukt mye Firefox men uten de problemene du beskriver. Har desverre ikke noe forslag utover å re-installere firefox og disable/avinstallere diverse plugins, hvis du har noen.
Slett også $HOME/Library/Application Support/Firefox hvis du reinstallerer.
Problemet ditt er at til og fra-variablene er static, alle tråd-instansene deler dermed samme intervall.
Trådinstansene deler derimot ikke primliste, så denne trenger du ikke synkronisere på, trådene kan bare rase ivei uten å løpe i beina på hverandre.
Det er også som du sier korrekt å implementere Runnable, men det hjelper - som du har funnet ut - ikke på resultatet her.
Til slutt putter du de tre resultatlistene i en ny liste-liste, det er unødvendig komplisert. Her er en lettere modda variant ... tillot meg å endre klassenavnene også, en tråd som heter Tråd sier oss fint lite...
package primecalculation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class PrimeCalculation {
private static class PrimeCalculationThread implements Runnable {
private ArrayList<Integer> primliste = new ArrayList<>();
private int fra;
private int til;
public PrimeCalculationThread(int fra, int til) {
this.fra = fra;
this.til = til;
}
public ArrayList<Integer> getPrimliste() {
return primliste;
}
public static boolean erPrimtall(int n) {
return !new String(new char[n]).matches(".?|(..+?)\\1+");
}
public static ArrayList<Integer> primtall(int f, int t) {
ArrayList<Integer> tall = new ArrayList<Integer>();
System.out.println("F: " + f + " T: " + t);
for (int i = f; i < t; i++) {
if (erPrimtall(i)) {
tall.add(i);
}
}
return tall;
}
public void run() {
primliste = primtall(fra, til);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ArrayList<Integer> sum = new ArrayList<Integer>();
//Oppretter tråder og starter de
PrimeCalculationThread pct1 = new PrimeCalculationThread(0, 10);
PrimeCalculationThread pct2 = new PrimeCalculationThread(11, 20);
PrimeCalculationThread pct3 = new PrimeCalculationThread(21, 30);
Thread tr1 = new Thread(pct1);
tr1.start();
Thread tr2 = new Thread(pct2);
tr2.start();
Thread tr3 = new Thread(pct3);
tr3.start();
try {
tr1.join();
tr2.join();
tr3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//Legger til primtallene i en ArrayList
sum.addAll(pct1.getPrimliste());
sum.addAll(pct2.getPrimliste());
sum.addAll(pct3.getPrimliste());
Collections.sort(sum);
for (Integer ai : sum) {
System.out.print(ai + " ");
}
}
}
Utskrift:
F: 11 T: 20
F: 21 T: 30
F: 0 T: 10
2 3 5 7 11 13 17 19 23 29
Legg merke til at utskriften av de tre intervallene kommer i "tilfeldig" rekkefølge.
Har ikke vært borti den der, og det kan vel nesten høres ut som en generell bug siden det er den andre maskinen du har med samme problem. Kanskje du kan gå til appleforhandleren din og se om det kanskje gjelder utstillingsmodellene også? I såfall ville jeg bare satt opp strømsparingen slik at den ikke går i dvale før den klappes sammen, eventuelt holdt fingra fra fatet mens den holder på å sovne inn?