String d1=2008-11-07T22:13:58.000+01:00,2008-08-15T12:07:58.000+02:00
//methode 1
Calendar cal = Calendar.getInstance();
cal.set(Integer.parseInt(d1.substring(0, 4)), Integer.parseInt(d1.substring(5, 7)), Integer.parseInt(d1.substring(8, 10)));
Date d = new Date(cal.getTimeInMillis());
//methode2
Locale localeUS = new Locale("en", "US");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD", localeUS);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = (Date) sdf.parse(dates.substring(0, 10));
Exmple 2 conversion string->date date->string
public String getDuree() throws ParseException{
//date:08/10/2012 heure:14:00
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy-HH:mm");
Date dates=formatter.parse(this.date+"-"+this.heure);
Date datee=formatter.parse(this.date+"-"+this.heureFin);
Long time=datee.getTime()-dates.getTime();
formatter = new SimpleDateFormat("HH:mm");
Date date= new Date(time);
return formatter.format(date);
}
package com.gadille.JavaTuto;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TutoList {
public static void main(String[] args) {
List listVmstat = new ArrayList();
listVmstat.add("toto");
listVmstat.add("titi");
List qcElements = new ArrayList();;
qcElements.add(new qcElement("numero", "0476897875"));
qcElements.add(new qcElement("numero", "0476897876"));
System.out.println("impressions");
for (int i = 0; i < listVmstat.size(); i++) {
System.out.println("listVmstat.get("+i+"):"+listVmstat.get(i));
}
System.out.println("\nimpression par iterator");
Iterator it = listVmstat.iterator();
while (it.hasNext()) {
System.out.println("it.next():" + it.next());
}
System.out.println("\nconversion en tableau");
String[] strList = new String[listVmstat.size()];
for (int i = 0; i < listVmstat.size(); i++) {
strList[i]=listVmstat.get(i);
}
System.out.println("strList[1]:"+strList[1]);
for (String msg : listVmstat){
System.out.println("msg"+msg);
}
for (QCElement qcElement : qcElements){
System.out.println(qcElement.getKey()+"="+qcElement.getValue());
}
}
}
}
impressions
listVmstat.get(0):toto
listVmstat.get(1):titi
impression par iterator
it.next():toto
it.next():titi
conversion en tableau
strList[1]:titi
Pour pouvoir utiliser la methode indexOf(Object o) dans une liste si votre liste est composer d'objet non natif il faut redefinir 2 méthode
hashCode: utilisé pour savoir si les objets sont les même en complemnt du egal (par default renvoie l'adresse du pointeur de l'objet)
Donc si on le remplace pas on deux objet a même contenue (deux adresse distinc) ne sont pas egaux
equals: qui est utilise en complemnt du hash pour savoir si les deux objet sont egaux
package fr.francetelecom.AsMetier.Global.Bean;
public class QCElement{
private String key;
private String value;
public QCElement(String key,String value){
this.key=key;
this.value=value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
//pour faire des recherche dans list on doit implementer le hashCode
@Override
public int hashCode() {
int hash=0;
if (key!=null){
hash=key.hashCode();
}else if (value!=null){
hash=value.hashCode();
}if (value!=null & key !=null){
hash=(key+value).hashCode();
}
return hash;
}
//et le equals
@Override
public boolean equals(Object obj) {
if (obj==null){
return false;
}else if (obj.getClass() == this.getClass()){
QCElement qcElement= (QCElement) obj;
if (this.getKey().equals(qcElement.getKey())&&this.getValue().equals(qcElement.getValue())){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
StringBuilder/StringBuffer ou Hashtable/HashMap.
Vector est synchronisée et donc thread-safe alors qu’ArrayList ne l’est pas.
Par conséquent, Vector est plus lent qu’ArrayList et ne doit être utilisé qu’en environnement multithreadé.
package com.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) {
String mapage="du baratin et la flute lionel.gadille@free.fr et encore du baratin";
String mapage2="du baratin et la flute lionel.gadille@free.fr";
//http://gadille.free.fr/doc/scripting/perl/perl.html#Regex \\s(w+@w+\\.\\w\\w)\\w+
System.out.println("g1");
Matcher matcher = Pattern.compile("(\\S+@\\w+.\\w\\w)\\W\\w+").matcher(mapage);
if (matcher.find()) {
System.out.println("glob:"+matcher.group());
System.out.println("mail:"+matcher.group(1));
}
System.out.println("g2");
matcher = Pattern.compile("(\\S+@\\w+.\\w\\w)").matcher(mapage2);
if (matcher.find()) {
System.out.println("glob:"+matcher.group());
System.out.println("mail:"+matcher.group(1));
}
}
}
Le but d'un thread et de faire executer pusieur programme en meme temps
C'est util notamentdans le cadre d'un ihm (evite de figer l'interface graphique) ou tous process un peux long
Cela permet d'utiliser plusieur processeur (core 2 duo, phenon ... ) essayer d'utiliser les thread des que posssible
Les trhead ne sont pas souhaitable pour lorsd des axcés a une ressource unique limité en bande passante par exemple un dique dur
En effet la lecture de deux fichiers en concurence entrainerais des depalcement de tete de lecture intempestif (un moteur c'est lent)
Il existe plusieur facons de faire un thread en voici une implementer Runnable implements Runnable
Implement= implementer ou ecrir sois meme le code
Runnable est une interface elle décrit le code qui doit etre ecrit
package com.gadille.JavaTuto.Thread;
public class Actiona implements Runnable {
Thread runner;
public void launch(){
runner = new Thread(this);
runner.start();
}
@Override
public void run() {
System.out.println("Thread -> hello from thread");
System.out.println("Thread -> go sleep");
try {
Thread.sleep(5000);//en ms
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread -> wakeup");
}
}
Attention palcer le le runner.start() aprés toute vos init sinon les init ce feront parfois avant parfois aprés
Notez bien que je n'est pas appelé run sinon le programme n'aurais pas marcher de maniere concurente
package com.gadille.JavaTuto.Thread;
public class ThreadMaina {
public static void main(String[] args) {
System.out.println("Main -> start");
Actiona ac= new Actiona();
ac.launch();
System.out.println("Main -> end");
}
}
Execution
Main -> start
Thread -> hello from thread
Thread -> go sleep
Main -> end
Thread -> wakeup
Notez L'ordre ... si vous suprimé le sleep le Thread ce termine avant car il est trop cour
Comme le changement de context (de Thread) est couteux en temps l'os prefere travaillez par tranche plus ou moins long (#100ms) sur chaque Thread
Donc Sans le spleep le Thread est fini avant le changemetn de context
Rajout d'un bollean pour controller la fin du thread
Rajout de nbr pour renvoyer une etat d'avencement ici calculler pour faire du pourcentage
if (0 == (i % 10000) && i > 0) nbr+=1; // si i=10 000 alors le modullo de i est different de zero
package com.gadille.JavaTuto.Thread;
public class Actionb implements Runnable {
boolean finish = false;
double a;
double b;
int purcent=0;
public boolean getFinish(){
return finish;
}
public double getResult(){
return a+b;
}
public int getPurcent(){
return purcent;
}
Thread runner;
public void launch(){
runner = new Thread(this);
runner.start();
}
@Override
public void run() {
System.out.println("Thread -> hello from thread");
for (int i=0;i<1000*1000;i++){
if (0 == (i % 10000) && i > 0) purcent+=1;
for (int j=0;j<3;j++){
long arg = 23;
a=java.lang.Math.log(arg);
b=java.lang.Math.hypot(2, 4);
}
}
System.out.println("Thread -> result done");
finish=true;
}
}
La presence du sleep est conseillé dans le mains car sinon on utilise enormement de ressource systeme a attendre le thread
Le choix de 1s et un bhon compromits et permet de remonter des info a l'utilisateur
package com.gadille.JavaTuto.Thread;
public class ThreadMainb {
public static void main(String[] args) {
System.out.println("Main -> start");
Actionb ac= new Actionb();
ac.launch();
int purc=0;
while (!(ac.getFinish())){
try {
Thread.sleep(1000);//en ms
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ac.getNbr()!=purc){
purc=ac.getNbr();
System.out.println("Main --> "+purc+"%");
}
}
System.out.println("Main -> Result:"+ac.getResult());
}
}
Voici le resultat de 2 run (adapter le j en focntion de votre proc)
Run1
Main -> start
Thread -> hello from thread
Main --> 27%
Main --> 54%
Main --> 81%
Thread -> result done
Main --> 99%
Main -> Result:7.607630170928729
Run2
Main -> start
Thread -> hello from thread
Main --> 28%
Main --> 60%
Main --> 92%
Thread -> result done
Main --> 99%
Main -> Result:7.607630170928729
L'annotation @interface permet de definir des tag personalisable
/*
* Juste pour indiquer qu'une methode ou class n'est pas entierement codé
*/
public @interface InProgress { }
@InProgress
public void mamethodepascode(){
...
}
Rajouter a sa comande java les options de debugage
-Xdebug -Xrunjdwp:transport=dt_socket,address=8010,server=y,suspend=n
Si suspend=y cela bloque le programme temps que eclipse ne lui donne pas l'ordre de repartir
Ensuite sous eclipse ouvrir le projet avec le code faire un debug remote application avec le port et le nom du serveur
placer vos break pointe et sa roule
aplicable sur web app, ou appli java ...
jvisualvm et jconsole Permet de faire du monitoring visuel temps reel
Ligne de cmd
jps permet de connetre les jre en cours d'execution avec leur pid a fournir au autre outils jstat(pour le gc)
jstat -gcutil 32684 1000 7
effectue 7 fois la commande avec un intervalle de 1000ms