├── .gitignore ├── AnimalsFxConcurrency ├── pom.xml └── src │ └── main │ ├── java │ └── space │ │ └── harbour │ │ └── thezoo │ │ ├── AnimalsApp.java │ │ ├── SuperAnimalsApp.java │ │ ├── controller │ │ └── AnimalsController.java │ │ ├── domain │ │ └── Animal.java │ │ ├── service │ │ ├── AnimalsApiService.java │ │ └── AnimalsService.java │ │ ├── task │ │ ├── GetAnimalsTask.java │ │ └── RemoveAnimalTask.java │ │ └── util │ │ ├── Constants.java │ │ └── Resources.java │ └── resources │ └── ui │ └── Countries.fxml ├── BarraProgreso ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── libraries │ │ └── libs.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── uiDesigner.xml │ ├── vcs.xml │ └── workspace.xml ├── BarraProgreso.iml ├── libs │ ├── jgoodies-common-1.8.0.jar │ └── jgoodies-forms-1.8.0.jar └── src │ └── org │ └── sfsoft │ └── barraprogreso │ ├── JBarraProgreso.form │ └── JBarraProgreso.java ├── Boxeo_v1 └── ExamenPSP │ ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml │ ├── ExamenPSP.iml │ └── src │ └── org │ └── sfsoft │ └── examenpsp1 │ ├── Boxeador.java │ ├── Principal.java │ └── Ring.java ├── Boxeo_v2 └── ExamenPSP │ ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml │ ├── ExamenPSP.iml │ └── src │ └── org │ └── sfsoft │ └── examenpsp1 │ ├── Boxeador.java │ ├── Principal.java │ └── Ring.java ├── Boxeo_v3 └── ExamenPSP │ ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml │ ├── ExamenPSP.iml │ └── src │ └── org │ └── sfsoft │ └── examenpsp1 │ ├── Boxeador.java │ ├── Principal.java │ └── Ring.java ├── CargarImagenes ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── libraries │ │ └── libs.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── uiDesigner.xml │ ├── vcs.xml │ └── workspace.xml ├── CargarImagenes.iml ├── libs │ ├── jgoodies-common-1.8.0.jar │ └── jgoodies-forms-1.8.0.jar └── src │ └── org │ └── sfsoft │ └── cargarimagenes │ ├── gui │ ├── JCargaImagenes.form │ └── JCargaImagenes.java │ ├── tasks │ └── TareaCargaImagen.java │ └── util │ └── FiltroImagen.java ├── CarreraCoches ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── CarreraCoches.iml └── src │ └── org │ └── sfsoft │ └── carreracoches │ ├── Carrera.java │ └── Coche.java ├── ContadorFx ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── svalero │ │ └── contador │ │ ├── App.java │ │ ├── controller │ │ └── AppController.java │ │ ├── task │ │ └── TimerTask.java │ │ └── util │ │ └── R.java │ └── resources │ └── ui │ └── contador.fxml ├── CountriesFxConcurrency ├── pom.xml └── src │ └── main │ ├── java │ └── space │ │ └── harbour │ │ └── countries │ │ ├── CountriesApp.java │ │ ├── SuperCountriesApp.java │ │ ├── controller │ │ └── CountriesController.java │ │ ├── domain │ │ ├── Country.java │ │ └── CountryName.java │ │ ├── service │ │ ├── CountriesApiService.java │ │ └── CountriesService.java │ │ ├── task │ │ └── DataTask.java │ │ └── util │ │ ├── Constants.java │ │ └── Resources.java │ └── resources │ └── ui │ └── Countries.fxml ├── DescargaFicheros ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── libraries │ │ └── libs.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── uiDesigner.xml │ ├── vcs.xml │ └── workspace.xml ├── DescargaFicheros.iml ├── libs │ ├── jgoodies-common-1.8.0.jar │ └── jgoodies-forms-1.8.0.jar └── src │ └── org │ └── sfsoft │ └── descargaficheros │ ├── gui │ ├── JDescargaFichero.form │ └── JDescargaFichero.java │ └── tareas │ └── Descarga.java ├── Despertador ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── libraries │ │ ├── Despertador.xml │ │ ├── forms_1_3_0_src.xml │ │ └── libs.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── Despertador.iml ├── libs │ ├── forms-1.2.1.jar │ ├── jgoodies-common-1.8.0.jar │ └── jgoodies-forms-1.8.0.jar └── src │ └── org │ └── sfsoft │ └── despertador │ ├── alarmas │ └── AlarmaDespertador.java │ ├── gui │ └── JDespertador.java │ └── util │ └── Util.java ├── HilosSincronizar ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── Hilos_Sincronizar.iml └── src │ └── org │ └── sfsoft │ └── hilos_sincronizar │ ├── Hilo1.java │ ├── Hilo2.java │ └── Hilos_Sincronizar.java ├── HilosSincronizar2 ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── Hilos_Sincronizar2.iml └── src │ └── org │ └── sfsoft │ └── hilos_sincronizar │ ├── Hilo1.java │ ├── Hilo2.java │ └── Hilos_Sincronizar.java ├── Hilos_Compartir ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── Hilos_Compartir.iml └── src │ └── org │ └── sfsoft │ └── hilos_compartir │ ├── Hilo.java │ ├── Hilos_Compartir.java │ └── Recurso.java ├── HolaHiloRunnable ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── HolaHiloRunnable.iml └── src │ └── org │ └── sfsoft │ └── holahilo2 │ ├── HolaHiloRunnable.java │ └── TareaRunnable.java ├── HolaHiloThread ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── HolaHiloThread.iml └── src │ └── org │ └── sfsoft │ └── holahilo │ ├── Hilo.java │ └── HolaHiloThread.java ├── LICENSE ├── MultidescargaFx ├── dlc.txt ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── svalero │ │ └── downloader │ │ ├── App.java │ │ ├── controller │ │ ├── AppController.java │ │ └── DownloadController.java │ │ ├── task │ │ └── DownloadTask.java │ │ └── util │ │ └── R.java │ └── resources │ ├── log4j2.xml │ └── ui │ ├── download.fxml │ └── multidownload.fxml ├── PatronObserver ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── PatronObserver.iml └── src │ └── org │ └── sfsoft │ └── patronobserver │ ├── Principal.java │ └── base │ ├── Cliente.java │ └── Producto.java ├── PatronObserverHilos ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── PatronObserverHilos.iml └── src │ └── org │ └── sfsoft │ └── patronobserverhilos │ ├── Principal.java │ └── base │ ├── TareaObservable.java │ └── TareaObserver.java ├── PersecucionAviones ├── .idea │ ├── .name │ ├── compiler.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── uiDesigner.xml │ ├── vcs.xml │ └── workspace.xml ├── PersecucionAviones.iml └── src │ └── com │ └── sfaci │ └── aviones │ ├── Principal.java │ └── base │ ├── Avion.java │ └── AvionPerseguidor.java ├── ProductorConsumidor ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── ProductorConsumidor.iml └── src │ └── org │ └── sfsoft │ └── productorconsumidor │ ├── Cola.java │ ├── Consumidor.java │ ├── Productor.java │ └── ProductorConsumidor.java ├── ProductorConsumidorN ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── ProductorConsumidorN.iml └── src │ └── org │ └── sfsoft │ └── productorconsumidor │ ├── Cola.java │ ├── Consumidor.java │ ├── Productor.java │ └── ProductorConsumidorN.java ├── README.md ├── UIDinamica ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── libraries │ │ └── libs.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── uiDesigner.xml │ ├── vcs.xml │ └── workspace.xml ├── UIDinamica.iml ├── img │ └── logo.png ├── libs │ ├── jgoodies-common-1.8.0.jar │ └── jgoodies-forms-1.8.0.jar └── src │ └── org │ └── sfaci │ └── uidinamica │ ├── Main.java │ ├── gui │ ├── PanelWorker.form │ ├── PanelWorker.java │ ├── SplashScreen.form │ ├── SplashScreen.java │ ├── Ventana.form │ └── Ventana.java │ └── tasks │ └── Tarea.java └── ejemplolog4j ├── .idea ├── .name ├── compiler.xml ├── encodings.xml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── libraries │ └── libs.xml ├── misc.xml ├── modules.xml ├── scopes │ └── scope_settings.xml ├── uiDesigner.xml ├── vcs.xml └── workspace.xml ├── ejemplolog4j.iml ├── ejemplolog4j.log ├── libs ├── log4j-api-2.7.jar └── log4j-core-2.7.jar ├── out └── production │ └── ejemplolog4j │ └── log4j2.xml └── src ├── com └── sfaci │ └── ejemplolog4j │ ├── Aplicacion.java │ └── OtraClase.java └── log4j2.xml /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | .DS_Store 3 | .idea 4 | target 5 | *.log 6 | *.iml 7 | out 8 | 9 | # Package Files # 10 | *.war 11 | *.ear 12 | *.jar 13 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/AnimalsApp.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo; 2 | 3 | import javafx.application.Application; 4 | import javafx.fxml.FXMLLoader; 5 | import javafx.scene.Scene; 6 | import javafx.scene.layout.BorderPane; 7 | import javafx.stage.Stage; 8 | import space.harbour.thezoo.controller.AnimalsController; 9 | import space.harbour.thezoo.util.Resources; 10 | 11 | /** 12 | * Demo application 13 | * @author Santiago Faci 14 | * @version 2021 15 | */ 16 | public class AnimalsApp extends Application { 17 | 18 | @Override 19 | public void init() throws Exception { 20 | super.init(); 21 | } 22 | 23 | @Override 24 | public void start(Stage stage) throws Exception { 25 | FXMLLoader loader = new FXMLLoader(); 26 | loader.setLocation(Resources.getUI("Countries.fxml")); 27 | loader.setController(new AnimalsController()); 28 | BorderPane pane = loader.load(); 29 | 30 | Scene scene = new Scene(pane); 31 | stage.setScene(scene); 32 | stage.setTitle("CountriesFX"); 33 | stage.show(); 34 | } 35 | 36 | @Override 37 | public void stop() throws Exception { 38 | super.stop(); 39 | } 40 | 41 | public static void main(String[] args) { 42 | launch(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/SuperAnimalsApp.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo; 2 | 3 | public class SuperAnimalsApp { 4 | public static void main(String[] args) { 5 | AnimalsApp.main(args); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/domain/Animal.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.domain; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | /** 7 | * Represents a country with all data I need 8 | * @author Santiago Faci 9 | * @version 2021 10 | */ 11 | @Data 12 | @ToString 13 | public class Animal { 14 | 15 | private long id; 16 | private String name; 17 | private String race; 18 | private float weight; 19 | private int maxSpeed; 20 | } 21 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/service/AnimalsApiService.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.service; 2 | 3 | import retrofit2.http.DELETE; 4 | import space.harbour.thezoo.domain.Animal; 5 | import retrofit2.Call; 6 | import retrofit2.http.GET; 7 | import retrofit2.http.Path; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * API Interface I need (https://restcountries.com/) 13 | * @author Santiago Faci 14 | * @version 2021 15 | */ 16 | public interface AnimalsApiService { 17 | 18 | @GET("animals") 19 | Call> getAllAnimals(); 20 | 21 | // Be carefull because this API returns a country list even if you ask only for one 22 | @GET("animals/{animalId}") 23 | Call getAnimal(@Path("animalId") long animalId); 24 | 25 | @DELETE("animals/{animalId}") 26 | Call removeAnimal(@Path("animalId") long animalId); 27 | } 28 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/service/AnimalsService.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.service; 2 | 3 | import space.harbour.thezoo.domain.Animal; 4 | import retrofit2.Call; 5 | import retrofit2.Response; 6 | import retrofit2.Retrofit; 7 | import retrofit2.converter.gson.GsonConverterFactory; 8 | import space.harbour.thezoo.util.Constants; 9 | 10 | import java.io.IOException; 11 | import java.util.List; 12 | 13 | /** 14 | * Operations implementation 15 | * @author Santiago Faci 16 | * @version 2021 17 | */ 18 | public class AnimalsService { 19 | 20 | private AnimalsApiService api; 21 | 22 | public AnimalsService() { 23 | Retrofit retrofit = new Retrofit.Builder() 24 | .baseUrl(Constants.URL) 25 | .addConverterFactory(GsonConverterFactory.create()) 26 | .build(); 27 | 28 | api = retrofit.create(AnimalsApiService.class); 29 | } 30 | 31 | public List getAllAnimals() { 32 | Call> allAnimalsCall = api.getAllAnimals(); 33 | 34 | try { 35 | System.out.println("calling API"); 36 | Response> response = allAnimalsCall.execute(); 37 | System.out.println(response.body().toString()); 38 | return response.body(); 39 | } catch (IOException ioe) { 40 | ioe.printStackTrace(); 41 | } 42 | 43 | return null; 44 | } 45 | 46 | public void removeAnimal(long animalId) throws IOException { 47 | Call animalsCall = api.removeAnimal(animalId); 48 | animalsCall.execute(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/task/GetAnimalsTask.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.task; 2 | 3 | import javafx.concurrent.Task; 4 | import space.harbour.thezoo.domain.Animal; 5 | import space.harbour.thezoo.service.AnimalsService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * A background task to search countries 11 | */ 12 | public class GetAnimalsTask extends Task> { 13 | @Override 14 | protected List call() throws Exception { 15 | AnimalsService animalsService = new AnimalsService(); 16 | return animalsService.getAllAnimals(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/task/RemoveAnimalTask.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.task; 2 | 3 | import javafx.concurrent.Task; 4 | import space.harbour.thezoo.domain.Animal; 5 | import space.harbour.thezoo.service.AnimalsService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * A background task to search countries 11 | */ 12 | public class RemoveAnimalTask extends Task> { 13 | 14 | private long animalId; 15 | 16 | public RemoveAnimalTask(long animalId) { 17 | this.animalId = animalId; 18 | } 19 | 20 | @Override 21 | protected Animal call() throws Exception { 22 | AnimalsService animalsService = new AnimalsService(); 23 | return animalsService.removeAnimal(animalId); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/util/Constants.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.util; 2 | 3 | /** 4 | * Constants 5 | * @author Santiago Faci 6 | * @version 2021 7 | */ 8 | public class Constants { 9 | 10 | public final static String URL = "http://localhost:8080"; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /AnimalsFxConcurrency/src/main/java/space/harbour/thezoo/util/Resources.java: -------------------------------------------------------------------------------- 1 | package space.harbour.thezoo.util; 2 | 3 | import java.io.File; 4 | import java.io.InputStream; 5 | import java.net.URL; 6 | 7 | public class Resources { 8 | 9 | public static InputStream getImage(String name) { 10 | return Thread.currentThread().getContextClassLoader().getResourceAsStream("images" + File.separator + name); 11 | } 12 | 13 | public static URL getUI(String name) { 14 | return Thread.currentThread().getContextClassLoader().getResource("ui" + File.separator + name); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/.name: -------------------------------------------------------------------------------- 1 | BarraProgreso -------------------------------------------------------------------------------- /BarraProgreso/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/libraries/libs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /BarraProgreso/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BarraProgreso/BarraProgreso.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /BarraProgreso/libs/jgoodies-common-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/BarraProgreso/libs/jgoodies-common-1.8.0.jar -------------------------------------------------------------------------------- /BarraProgreso/libs/jgoodies-forms-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/BarraProgreso/libs/jgoodies-forms-1.8.0.jar -------------------------------------------------------------------------------- /BarraProgreso/src/org/sfsoft/barraprogreso/JBarraProgreso.form: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/.name: -------------------------------------------------------------------------------- 1 | ExamenPSP -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/ExamenPSP.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/src/org/sfsoft/examenpsp1/Boxeador.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Boxeador extends Thread { 10 | 11 | private String nombre; 12 | private Ring ring; 13 | private int golpes; 14 | 15 | public Boxeador(String nombre, Ring ring) { 16 | 17 | this.nombre = nombre; 18 | this.ring = ring; 19 | } 20 | 21 | public String getNombre() { 22 | return nombre; 23 | } 24 | 25 | public int getGolpes() { 26 | return golpes; 27 | } 28 | 29 | public void pegar() { 30 | golpes++; 31 | } 32 | 33 | @Override 34 | public void run() { 35 | 36 | while (ring.getGolpes() < 100) { 37 | 38 | ring.pegar(this); 39 | try { 40 | Thread.sleep(new Random().nextInt(500)); 41 | } catch (InterruptedException ie) {} 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/src/org/sfsoft/examenpsp1/Principal.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | /** 4 | * @author Santiago Faci 5 | * @version curso 2014-2015 6 | */ 7 | public class Principal { 8 | 9 | public static void main(String args[]) { 10 | 11 | Ring ring = new Ring(); 12 | Boxeador boxeador1 = new Boxeador("Tyson", ring); 13 | Boxeador boxeador2 = new Boxeador("Rocky", ring); 14 | 15 | boxeador1.start(); 16 | boxeador2.start(); 17 | 18 | try { 19 | boxeador1.join(); 20 | boxeador2.join(); 21 | } catch (InterruptedException ie) {} 22 | 23 | System.out.println("Fin del combate"); 24 | if (boxeador1.getGolpes() > boxeador2.getGolpes()) 25 | System.out.println("Ha ganado " + boxeador1.getNombre()); 26 | else if (boxeador1.getGolpes() < boxeador2.getGolpes()) 27 | System.out.println("Ha ganado " + boxeador2.getNombre()); 28 | else 29 | System.out.println("Empate"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Boxeo_v1/ExamenPSP/src/org/sfsoft/examenpsp1/Ring.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | /** 4 | * @author Santiago Faci 5 | * @version curso 2014-2015 6 | */ 7 | public class Ring { 8 | 9 | private int golpes; 10 | 11 | public Ring() { 12 | golpes = 0; 13 | } 14 | 15 | public int getGolpes() { 16 | return golpes; 17 | } 18 | 19 | public synchronized void pegar(Boxeador boxeador) { 20 | 21 | boxeador.pegar(); 22 | golpes++; 23 | 24 | System.out.println("Pegada de " + boxeador.getNombre() + " (" + boxeador.getGolpes() + ")"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/.name: -------------------------------------------------------------------------------- 1 | ExamenPSP -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/ExamenPSP.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/src/org/sfsoft/examenpsp1/Boxeador.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Boxeador extends Thread { 10 | 11 | private String nombre; 12 | private Ring ring; 13 | private int golpes; 14 | private Boxeador rival; 15 | private boolean noqueado; 16 | 17 | public Boxeador(String nombre, Ring ring) { 18 | 19 | this.nombre = nombre; 20 | this.ring = ring; 21 | } 22 | 23 | public String getNombre() { 24 | return nombre; 25 | } 26 | 27 | public int getGolpes() { 28 | return golpes; 29 | } 30 | 31 | public void pegar() { 32 | golpes++; 33 | 34 | rival.setNoqueado(true); 35 | } 36 | 37 | public void setNoqueado(boolean noqueado) { 38 | this.noqueado = noqueado; 39 | } 40 | 41 | public void setRival(Boxeador rival) { 42 | this.rival = rival; 43 | } 44 | 45 | public Boxeador getRival() { 46 | return rival; 47 | } 48 | 49 | public void noquear() { 50 | 51 | } 52 | 53 | @Override 54 | public void run() { 55 | 56 | while (ring.getGolpes() < 100) { 57 | 58 | if (noqueado) { 59 | try { 60 | Thread.sleep(new Random().nextInt(250)); 61 | } catch (InterruptedException ie) {} 62 | noqueado = false; 63 | } 64 | else { 65 | ring.pegar(this); 66 | try { 67 | Thread.sleep(new Random().nextInt(500)); 68 | } catch (InterruptedException ie) {} 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/src/org/sfsoft/examenpsp1/Principal.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | /** 4 | * @author Santiago Faci 5 | * @version curso 2014-2015 6 | */ 7 | public class Principal { 8 | 9 | public static void main(String args[]) { 10 | 11 | Ring ring = new Ring(); 12 | Boxeador boxeador1 = new Boxeador("Tyson", ring); 13 | Boxeador boxeador2 = new Boxeador("Rocky", ring); 14 | 15 | boxeador1.setRival(boxeador2); 16 | boxeador2.setRival(boxeador1); 17 | 18 | boxeador1.start(); 19 | boxeador2.start(); 20 | 21 | try { 22 | boxeador1.join(); 23 | boxeador2.join(); 24 | } catch (InterruptedException ie) {} 25 | 26 | System.out.println("Fin del combate"); 27 | if (boxeador1.getGolpes() > boxeador2.getGolpes()) 28 | System.out.println("Ha ganado " + boxeador1.getNombre()); 29 | else if (boxeador1.getGolpes() < boxeador2.getGolpes()) 30 | System.out.println("Ha ganado " + boxeador2.getNombre()); 31 | else 32 | System.out.println("Empate"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Boxeo_v2/ExamenPSP/src/org/sfsoft/examenpsp1/Ring.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | /** 4 | * @author Santiago Faci 5 | * @version curso 2014-2015 6 | */ 7 | public class Ring { 8 | 9 | private int golpes; 10 | 11 | public Ring() { 12 | golpes = 0; 13 | } 14 | 15 | public int getGolpes() { 16 | return golpes; 17 | } 18 | 19 | public synchronized void pegar(Boxeador boxeador) { 20 | 21 | boxeador.pegar(); 22 | golpes++; 23 | 24 | System.out.println("Pegada de " + boxeador.getNombre() + " (" + boxeador.getGolpes() + ")"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/.name: -------------------------------------------------------------------------------- 1 | ExamenPSP -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/ExamenPSP.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/src/org/sfsoft/examenpsp1/Boxeador.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Boxeador extends Thread { 10 | 11 | private String nombre; 12 | private Ring ring; 13 | private int golpes; 14 | private Boxeador rival; 15 | private boolean noqueado; 16 | 17 | public Boxeador(String nombre, Ring ring) { 18 | 19 | this.nombre = nombre; 20 | this.ring = ring; 21 | } 22 | 23 | public String getNombre() { 24 | return nombre; 25 | } 26 | 27 | public int getGolpes() { 28 | return golpes; 29 | } 30 | 31 | public void pegar() { 32 | golpes++; 33 | 34 | rival.setNoqueado(true); 35 | } 36 | 37 | public synchronized void setNoqueado(boolean noqueado) { 38 | this.noqueado = noqueado; 39 | } 40 | 41 | public void setRival(Boxeador rival) { 42 | this.rival = rival; 43 | } 44 | 45 | public Boxeador getRival() { 46 | return rival; 47 | } 48 | 49 | public void noquear() { 50 | 51 | } 52 | 53 | @Override 54 | public void run() { 55 | 56 | while (ring.getGolpes() < 100) { 57 | 58 | if (noqueado) { 59 | try { 60 | Thread.sleep(new Random().nextInt(250)); 61 | } catch (InterruptedException ie) {} 62 | noqueado = false; 63 | } 64 | else { 65 | ring.pegar(this); 66 | try { 67 | Thread.sleep(new Random().nextInt(500)); 68 | } catch (InterruptedException ie) {} 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/src/org/sfsoft/examenpsp1/Principal.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Principal { 10 | 11 | public static void main(String args[]) { 12 | 13 | int n = 20; 14 | Random generador = new Random(); 15 | Boxeador[] boxeadores = new Boxeador[n]; 16 | Ring ring = new Ring(); 17 | 18 | // Crea los boxeadores 19 | for (int i = 0; i < n; i++) 20 | boxeadores[i] = new Boxeador(String.valueOf(i), ring); 21 | 22 | // Se les asigna rival (puede acabar peg�ndose a si mismo) 23 | for (int i = 0; i < n; i++) 24 | boxeadores[i].setRival(boxeadores[generador.nextInt(n - 1)]); 25 | 26 | // Inicia el combate 27 | for (int i = 0; i < n; i++) 28 | boxeadores[i].start(); 29 | 30 | // Espera que llegue a su fin 31 | for (int i = 0; i < n; i++) { 32 | try { 33 | boxeadores[i].join(); 34 | } catch (InterruptedException ie) {} 35 | } 36 | 37 | System.out.println("Fin del combate"); 38 | 39 | // Calcula el boxeador con m�s golpes (no respeta empates) 40 | int golpesGanadores = 0; 41 | String ganador = null; 42 | for (Boxeador boxeador : boxeadores) { 43 | if (boxeador.getGolpes() > golpesGanadores) { 44 | ganador = boxeador.getNombre(); 45 | golpesGanadores = boxeador.getGolpes(); 46 | } 47 | } 48 | 49 | System.out.println("El ganador es: " + ganador); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Boxeo_v3/ExamenPSP/src/org/sfsoft/examenpsp1/Ring.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.examenpsp1; 2 | 3 | /** 4 | * @author Santiago Faci 5 | * @version curso 2014-2015 6 | */ 7 | public class Ring { 8 | 9 | private int golpes; 10 | 11 | public Ring() { 12 | golpes = 0; 13 | } 14 | 15 | public int getGolpes() { 16 | return golpes; 17 | } 18 | 19 | public synchronized void pegar(Boxeador boxeador) { 20 | 21 | boxeador.pegar(); 22 | golpes++; 23 | 24 | System.out.println("Pegada de " + boxeador.getNombre() + " (" + boxeador.getGolpes() + ")"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/.name: -------------------------------------------------------------------------------- 1 | CargarImagenes -------------------------------------------------------------------------------- /CargarImagenes/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/libraries/libs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /CargarImagenes/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CargarImagenes/CargarImagenes.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /CargarImagenes/libs/jgoodies-common-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/CargarImagenes/libs/jgoodies-common-1.8.0.jar -------------------------------------------------------------------------------- /CargarImagenes/libs/jgoodies-forms-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/CargarImagenes/libs/jgoodies-forms-1.8.0.jar -------------------------------------------------------------------------------- /CargarImagenes/src/org/sfsoft/cargarimagenes/util/FiltroImagen.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.cargarimagenes.util; 2 | 3 | import java.io.File; 4 | import java.io.FileFilter; 5 | 6 | /** 7 | * Clase que implementa un filtro aplicable sobre ficheros 8 | * En este caso es un filtro para ficheros de imagen 9 | * @author Santiago Faci 10 | * @version curso 2014-2015 11 | */ 12 | public class FiltroImagen implements FileFilter{ 13 | 14 | @Override 15 | public boolean accept(File fichero) { 16 | 17 | if (fichero.getName().endsWith(".jpg")) 18 | return true; 19 | 20 | if (fichero.getName().endsWith(".png")) 21 | return true; 22 | 23 | if (fichero.getName().endsWith(".gif")) 24 | return true; 25 | 26 | return false; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/.name: -------------------------------------------------------------------------------- 1 | CarreraCoches -------------------------------------------------------------------------------- /CarreraCoches/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /CarreraCoches/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CarreraCoches/CarreraCoches.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /CarreraCoches/src/org/sfsoft/carreracoches/Coche.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.carreracoches; 2 | 3 | import java.util.Random; 4 | 5 | import javax.swing.JLabel; 6 | import javax.swing.SwingWorker; 7 | 8 | /** 9 | * Representa a cada uno de los coches que compiten en la carrera 10 | * Notifican, mediante la clase SwingWorker su progreso al UI de la clase principal 11 | * @author Santiago Faci 12 | * @version curso 2014-2015 13 | */ 14 | public class Coche extends SwingWorker { 15 | 16 | private int velocidad; 17 | private int distanciaCarrera; 18 | private int distanciaRecorrida; 19 | private JLabel marcador; 20 | private String nombre; 21 | 22 | public Coche(int velocidad, int distanciaCarrera, 23 | JLabel marcador, String nombre) { 24 | 25 | this.velocidad = velocidad; 26 | this.distanciaCarrera = distanciaCarrera; 27 | distanciaRecorrida = 0; 28 | this.marcador = marcador; 29 | this.nombre = nombre; 30 | } 31 | 32 | public Coche(int distanciaCarrera, 33 | JLabel marcador, String nombre) { 34 | 35 | this.velocidad = new Random().nextInt(30) + 5; 36 | this.distanciaCarrera = distanciaCarrera; 37 | distanciaRecorrida = 0; 38 | this.marcador = marcador; 39 | this.nombre = nombre; 40 | } 41 | 42 | @Override 43 | protected Void doInBackground() throws Exception { 44 | 45 | while (distanciaRecorrida < distanciaCarrera) { 46 | Thread.sleep(100); 47 | distanciaRecorrida += velocidad; 48 | if (distanciaRecorrida > distanciaCarrera) 49 | distanciaRecorrida = distanciaCarrera; 50 | 51 | setProgress(distanciaRecorrida * 100 / 52 | distanciaCarrera); 53 | 54 | /*if (isCancelled()) 55 | return null;*/ 56 | } 57 | 58 | marcador.setText(nombre + ": He ganado"); 59 | firePropertyChange("ganador", "", nombre); 60 | 61 | return null; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /ContadorFx/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.svalero.contador 8 | Contador 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 17 13 | 17 14 | 15 | 16 | 17 | 18 | org.openjfx 19 | javafx-controls 20 | 19 21 | 22 | 23 | org.openjfx 24 | javafx-fxml 25 | 19 26 | 27 | 28 | 29 | 30 | 31 | 32 | org.apache.maven.plugins 33 | maven-compiler-plugin 34 | 3.8.0 35 | 36 | 17 37 | 17 38 | 17 39 | 40 | 41 | 42 | org.openjfx 43 | javafx-maven-plugin 44 | 0.0.3 45 | 46 | com.svalero.contador.App 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ContadorFx/src/main/java/com/svalero/contador/App.java: -------------------------------------------------------------------------------- 1 | package com.svalero.contador; 2 | 3 | import com.svalero.contador.controller.AppController; 4 | import com.svalero.contador.util.R; 5 | import javafx.application.Application; 6 | import javafx.fxml.FXMLLoader; 7 | import javafx.scene.Scene; 8 | import javafx.scene.layout.VBox; 9 | import javafx.stage.Stage; 10 | 11 | public class App extends Application { 12 | 13 | @Override 14 | public void start(Stage stage) throws Exception { 15 | AppController controller = new AppController(); 16 | 17 | FXMLLoader loader = new FXMLLoader(); 18 | loader.setLocation(R.getUI("contador.fxml")); 19 | loader.setController(controller); 20 | VBox vBox = loader.load(); 21 | 22 | Scene scene = new Scene(vBox); 23 | stage.setScene(scene); 24 | stage.show(); 25 | } 26 | 27 | public static void main(String[] args) { 28 | launch(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ContadorFx/src/main/java/com/svalero/contador/controller/AppController.java: -------------------------------------------------------------------------------- 1 | package com.svalero.contador.controller; 2 | 3 | import com.svalero.contador.task.TimerTask; 4 | import javafx.concurrent.Worker; 5 | import javafx.event.Event; 6 | import javafx.fxml.FXML; 7 | import javafx.scene.control.Alert; 8 | import javafx.scene.control.Label; 9 | import javafx.scene.control.ProgressBar; 10 | import javafx.scene.control.TextField; 11 | 12 | public class AppController { 13 | 14 | public TextField tfValue; 15 | public ProgressBar progressBar; 16 | public Label statusLabel; 17 | 18 | private TimerTask timerTask; 19 | 20 | public AppController() { 21 | 22 | } 23 | 24 | @FXML 25 | public void startCounter(Event event) { 26 | int count = Integer.parseInt(tfValue.getText()); 27 | 28 | timerTask = new TimerTask(count); 29 | timerTask.stateProperty().addListener((observableValue, oldState, newState) -> { 30 | if (newState == Worker.State.SUCCEEDED) { 31 | Alert alert = new Alert(Alert.AlertType.INFORMATION); 32 | alert.setContentText("La tarea ha terminado con éxito"); 33 | alert.show(); 34 | } else if (newState == Worker.State.CANCELLED) { 35 | Alert alert = new Alert(Alert.AlertType.WARNING); 36 | alert.setContentText("La tarea ha sido cancelada por el usuario"); 37 | alert.show(); 38 | } 39 | }); 40 | 41 | progressBar.progressProperty().unbind(); 42 | progressBar.progressProperty().bind(timerTask.progressProperty()); 43 | 44 | timerTask.valueProperty().addListener((observableValue, oldValue, newValue) -> 45 | statusLabel.setText(newValue.toString())); 46 | 47 | new Thread(timerTask).start(); 48 | } 49 | 50 | @FXML 51 | public void stopCounter(Event event) { 52 | if (timerTask != null) 53 | timerTask.cancel(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /ContadorFx/src/main/java/com/svalero/contador/task/TimerTask.java: -------------------------------------------------------------------------------- 1 | package com.svalero.contador.task; 2 | 3 | import javafx.concurrent.Task; 4 | 5 | public class TimerTask extends Task { 6 | 7 | private int count; 8 | 9 | public TimerTask(int count) { 10 | this.count = count; 11 | } 12 | 13 | @Override 14 | protected Integer call() throws Exception { 15 | for (int i = 0; i <= count; i++) { 16 | Thread.sleep(1000); 17 | updateValue(i); 18 | updateProgress(i, count); 19 | } 20 | 21 | return null; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ContadorFx/src/main/java/com/svalero/contador/util/R.java: -------------------------------------------------------------------------------- 1 | package com.svalero.contador.util; 2 | 3 | import java.io.File; 4 | import java.net.URL; 5 | 6 | public class R { 7 | 8 | public static URL getUI(String name) { 9 | return Thread.currentThread().getContextClassLoader().getResource("ui" + File.separator + name); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/CountriesApp.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries; 2 | 3 | import javafx.application.Application; 4 | import javafx.fxml.FXMLLoader; 5 | import javafx.scene.Scene; 6 | import javafx.scene.layout.BorderPane; 7 | import javafx.stage.Stage; 8 | import space.harbour.countries.controller.CountriesController; 9 | import space.harbour.countries.domain.Country; 10 | import space.harbour.countries.service.CountriesService; 11 | import space.harbour.countries.util.Resources; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * Demo application 17 | * @author Santiago Faci 18 | * @version 2021 19 | */ 20 | public class CountriesApp extends Application { 21 | 22 | @Override 23 | public void init() throws Exception { 24 | super.init(); 25 | } 26 | 27 | @Override 28 | public void start(Stage stage) throws Exception { 29 | FXMLLoader loader = new FXMLLoader(); 30 | loader.setLocation(Resources.getUI("Countries.fxml")); 31 | loader.setController(new CountriesController()); 32 | BorderPane pane = loader.load(); 33 | 34 | Scene scene = new Scene(pane); 35 | stage.setScene(scene); 36 | stage.setTitle("CountriesFX"); 37 | stage.show(); 38 | } 39 | 40 | @Override 41 | public void stop() throws Exception { 42 | super.stop(); 43 | } 44 | 45 | public static void main(String[] args) { 46 | launch(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/SuperCountriesApp.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries; 2 | 3 | public class SuperCountriesApp { 4 | public static void main(String[] args) { 5 | CountriesApp.main(args); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/domain/Country.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.domain; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | /** 7 | * Represents a country with all data I need 8 | * @author Santiago Faci 9 | * @version 2021 10 | */ 11 | @Data 12 | @ToString 13 | public class Country { 14 | 15 | private CountryName name; 16 | private String region; 17 | private String subregion; 18 | private int population; 19 | 20 | public String getName() { 21 | return name.getCommon(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/domain/CountryName.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.domain; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | /** 7 | * Represents a country name (see a sample at https://restcountries.com/v3.1/all) 8 | * @author Santiago Faci 9 | * @version 2021 10 | */ 11 | @Data 12 | @ToString 13 | public class CountryName { 14 | 15 | private String common; 16 | private String official; 17 | } 18 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/service/CountriesApiService.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.service; 2 | 3 | import retrofit2.http.Query; 4 | import space.harbour.countries.domain.Country; 5 | import retrofit2.Call; 6 | import retrofit2.http.GET; 7 | import retrofit2.http.Path; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * API Interface I need (https://restcountries.com/) 13 | * @author Santiago Faci 14 | * @version 2021 15 | */ 16 | public interface CountriesApiService { 17 | 18 | @GET("/v3.1/all") 19 | Call> getAllCountries(); 20 | 21 | // Be carefull because this API returns a country list even if you ask only for one 22 | @GET("/v3.1/name/{name}") 23 | Call> getCountry(@Path("name") String name); 24 | 25 | // TODO Add as many operations as you need to call 26 | } 27 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/service/CountriesService.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.service; 2 | 3 | import space.harbour.countries.domain.Country; 4 | import retrofit2.Call; 5 | import retrofit2.Response; 6 | import retrofit2.Retrofit; 7 | import retrofit2.converter.gson.GsonConverterFactory; 8 | import space.harbour.countries.util.Constants; 9 | 10 | import java.io.IOException; 11 | import java.util.List; 12 | 13 | /** 14 | * Operations implementation 15 | * @author Santiago Faci 16 | * @version 2021 17 | */ 18 | public class CountriesService { 19 | 20 | private CountriesApiService api; 21 | 22 | public CountriesService() { 23 | Retrofit retrofit = new Retrofit.Builder() 24 | .baseUrl(Constants.URL) 25 | .addConverterFactory(GsonConverterFactory.create()) 26 | .build(); 27 | 28 | api = retrofit.create(CountriesApiService.class); 29 | } 30 | 31 | public List getAllCountries() { 32 | Call> allCountriesCall = api.getAllCountries(); 33 | try { 34 | Response> response = allCountriesCall.execute(); 35 | return response.body(); 36 | } catch (IOException ioe) { 37 | ioe.printStackTrace(); 38 | } 39 | 40 | return null; 41 | } 42 | 43 | // TODO Implement the method to get information about a specific country 44 | public List getCountries(String searchText) { 45 | Call> countriesCall = api.getCountry(searchText); 46 | try { 47 | Response> response = countriesCall.execute(); 48 | return response.body(); 49 | } catch (IOException ioe) { 50 | ioe.printStackTrace(); 51 | } 52 | 53 | return null; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/task/DataTask.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.task; 2 | 3 | import javafx.concurrent.Task; 4 | import space.harbour.countries.domain.Country; 5 | import space.harbour.countries.service.CountriesService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * A background task to search countries 11 | */ 12 | public class DataTask extends Task> { 13 | 14 | private String searchText; 15 | 16 | public DataTask() { 17 | } 18 | 19 | public DataTask(String searchText) { 20 | this.searchText = searchText; 21 | } 22 | 23 | @Override 24 | protected List call() throws Exception { 25 | CountriesService countriesService = new CountriesService(); 26 | if (searchText == null) { 27 | return countriesService.getAllCountries(); 28 | } else { 29 | return countriesService.getCountries(searchText); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/util/Constants.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.util; 2 | 3 | /** 4 | * Constants 5 | * @author Santiago Faci 6 | * @version 2021 7 | */ 8 | public class Constants { 9 | 10 | public final static String URL = "https://restcountries.com/"; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /CountriesFxConcurrency/src/main/java/space/harbour/countries/util/Resources.java: -------------------------------------------------------------------------------- 1 | package space.harbour.countries.util; 2 | 3 | import java.io.File; 4 | import java.io.InputStream; 5 | import java.net.URL; 6 | 7 | public class Resources { 8 | 9 | public static InputStream getImage(String name) { 10 | return Thread.currentThread().getContextClassLoader().getResourceAsStream("images" + File.separator + name); 11 | } 12 | 13 | public static URL getUI(String name) { 14 | return Thread.currentThread().getContextClassLoader().getResource("ui" + File.separator + name); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/.name: -------------------------------------------------------------------------------- 1 | DescargaFicheros -------------------------------------------------------------------------------- /DescargaFicheros/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/libraries/libs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /DescargaFicheros/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DescargaFicheros/DescargaFicheros.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /DescargaFicheros/libs/jgoodies-common-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/DescargaFicheros/libs/jgoodies-common-1.8.0.jar -------------------------------------------------------------------------------- /DescargaFicheros/libs/jgoodies-forms-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/DescargaFicheros/libs/jgoodies-forms-1.8.0.jar -------------------------------------------------------------------------------- /DescargaFicheros/src/org/sfsoft/descargaficheros/tareas/Descarga.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.descargaficheros.tareas; 2 | 3 | import java.io.FileNotFoundException; 4 | import java.io.FileOutputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.net.MalformedURLException; 8 | import java.net.URL; 9 | import java.net.URLConnection; 10 | 11 | import javax.swing.SwingWorker; 12 | 13 | /** 14 | * Tarea SwingWorker que realiza la descarga de un fichero 15 | * @author Santiago Faci 16 | * @version curso 2015-2016 17 | */ 18 | public class Descarga extends SwingWorker{ 19 | 20 | // La URL del fichero a descargar 21 | private String urlFichero; 22 | // La ruta del disco donde se descargará 23 | private String rutaFichero; 24 | 25 | public Descarga(String urlFichero, String rutaFichero) { 26 | this.urlFichero = urlFichero; 27 | this.rutaFichero = rutaFichero; 28 | } 29 | 30 | @Override 31 | protected Void doInBackground() throws MalformedURLException, FileNotFoundException, IOException { 32 | 33 | URL url = new URL(urlFichero); 34 | URLConnection conexion = url.openConnection(); 35 | // Obtiene el tamaño del fichero en bytes 36 | int tamanoFichero = conexion.getContentLength(); 37 | 38 | InputStream is = url.openStream(); 39 | FileOutputStream fos = new FileOutputStream(rutaFichero); 40 | byte[] bytes = new byte[2048]; 41 | int longitud = 0; 42 | int progresoDescarga = 0; 43 | 44 | // Descarga el fichero y va notificando el progreso 45 | while ((longitud = is.read(bytes)) != -1) { 46 | fos.write(bytes, 0, longitud); 47 | 48 | progresoDescarga += longitud; 49 | setProgress((int) (progresoDescarga * 100 / tamanoFichero)); 50 | } 51 | 52 | is.close(); 53 | fos.close(); 54 | 55 | setProgress(100); 56 | 57 | return null; 58 | } 59 | } -------------------------------------------------------------------------------- /Despertador/.idea/.name: -------------------------------------------------------------------------------- 1 | Despertador -------------------------------------------------------------------------------- /Despertador/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Despertador/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Despertador/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Despertador/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /Despertador/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Despertador/.idea/libraries/Despertador.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Despertador/.idea/libraries/forms_1_3_0_src.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Despertador/.idea/libraries/libs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Despertador/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Despertador/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Despertador/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Despertador/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Despertador/Despertador.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Despertador/libs/forms-1.2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/Despertador/libs/forms-1.2.1.jar -------------------------------------------------------------------------------- /Despertador/libs/jgoodies-common-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/Despertador/libs/jgoodies-common-1.8.0.jar -------------------------------------------------------------------------------- /Despertador/libs/jgoodies-forms-1.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeandcoke/java-concurrencia/fe596e5a0d540d889d48b0c9db01b098ee9f5774/Despertador/libs/jgoodies-forms-1.8.0.jar -------------------------------------------------------------------------------- /Despertador/src/org/sfsoft/despertador/alarmas/AlarmaDespertador.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.despertador.alarmas; 2 | 3 | import javax.swing.JLabel; 4 | import javax.swing.SwingWorker; 5 | 6 | import org.sfsoft.despertador.util.Util; 7 | 8 | /** 9 | * Clase que crea una tarea en segundo plano que interactúa con un GUI 10 | * de forma 'thread-safe' 11 | * 12 | * @author Santiago Faci 13 | * @version curso 2014-2015 14 | */ 15 | public class AlarmaDespertador extends SwingWorker { 16 | 17 | private int hora; 18 | private int minuto; 19 | private boolean activada; 20 | private JLabel lbEstado; 21 | 22 | /** 23 | * Constructor 24 | * @param lbEstado Etiqueta del GUI que actualiza esta tarea en segundo plano 25 | * @param hora hora de la alarma 26 | * @param minuto minuto de la arlama 27 | */ 28 | public AlarmaDespertador(JLabel lbEstado, int hora, int minuto) { 29 | 30 | this.lbEstado = lbEstado; 31 | this.hora = hora; 32 | this.minuto = minuto; 33 | activada = true; 34 | } 35 | 36 | /** 37 | * Desactiva la alarma 38 | */ 39 | public void desactivar() { 40 | activada = false; 41 | } 42 | 43 | /** 44 | * Hace sonar la alarma. Actualiza el GUI con un mensaje 45 | */ 46 | public void sonar() { 47 | 48 | lbEstado.setText("Despierta!!!!!!"); 49 | desactivar(); 50 | } 51 | 52 | /** 53 | * Método donde se define la tarea en segundo plano que se debe realizar 54 | */ 55 | @Override 56 | protected Void doInBackground() throws Exception { 57 | 58 | int[] momentoActual = new int[2]; 59 | 60 | /* 61 | * Comprueba si tiene que sonar mientras esté activada y no se haya terminado la tarea (isDone) 62 | */ 63 | while ((activada) && (!isDone())) { 64 | 65 | System.out.println("Comprobando hora"); 66 | 67 | momentoActual = Util.getHoraMinutoActual(); 68 | if ((momentoActual[0] == hora) && (momentoActual[1] == minuto)) { 69 | sonar(); 70 | } 71 | 72 | try { 73 | Thread.sleep(500); 74 | } catch (InterruptedException ie) {} 75 | } 76 | 77 | if (isCancelled()) 78 | lbEstado.setText("Alarma cancelada por el usuario"); 79 | 80 | return null; 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /Despertador/src/org/sfsoft/despertador/util/Util.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.despertador.util; 2 | 3 | import java.util.Calendar; 4 | import java.util.GregorianCalendar; 5 | 6 | /** 7 | * Clase con métodos 8 | * 9 | * @author Santiago Faci 10 | * @version curso 2014-2015 11 | */ 12 | public class Util { 13 | 14 | /** 15 | * Devuelve la hora y minuto actual 16 | * @return Un vector con la hora en la posición 0 y los minutos en la posición 1 17 | */ 18 | public static int[] getHoraMinutoActual() { 19 | 20 | int horaMinuto[] = new int[2]; 21 | Calendar calendario = new GregorianCalendar(); 22 | 23 | horaMinuto[0] = calendario.get(Calendar.HOUR_OF_DAY); 24 | horaMinuto[1] = calendario.get(Calendar.MINUTE); 25 | 26 | return horaMinuto; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/.name: -------------------------------------------------------------------------------- 1 | Hilos_Sincronizar -------------------------------------------------------------------------------- /HilosSincronizar/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /HilosSincronizar/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HilosSincronizar/Hilos_Sincronizar.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /HilosSincronizar/src/org/sfsoft/hilos_sincronizar/Hilo1.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que representa a un hilo 5 | * @author Santiago Faci 6 | * @version curso 2014-2015 7 | * 8 | */ 9 | public class Hilo1 extends Thread { 10 | 11 | private final static int MAXIMO = 10; 12 | 13 | /* 14 | * Tarea que desempeña el hilo. En este caso de forma simbólica 15 | * pinta una serie de líneas por pantalla 16 | * @see java.lang.Thread#run() 17 | */ 18 | @Override 19 | public void run() { 20 | 21 | try { 22 | for (int i = 0; i < MAXIMO; i++) { 23 | System.out.println("Hola, soy el hilo 1"); 24 | Thread.sleep(500); 25 | } 26 | } catch (InterruptedException ie) {} 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /HilosSincronizar/src/org/sfsoft/hilos_sincronizar/Hilo2.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que representa a un hilo que debe esperar a que termine 5 | * otro hilo para empezar su tarea 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | * 9 | */ 10 | public class Hilo2 extends Thread { 11 | 12 | private final static int MAXIMO = 5; 13 | // Hilo al que deberá esperar 14 | private Thread hilo; 15 | 16 | public Hilo2(Thread hilo) { 17 | this.hilo = hilo; 18 | } 19 | 20 | /* 21 | * Tarea que desempeña el hilo. En este caso de forma simbólica 22 | * pinta una serie de líneas por pantalla 23 | * @see java.lang.Thread#run() 24 | */ 25 | @Override 26 | public void run() { 27 | 28 | try { 29 | 30 | // Espera a que termine el otro hilo 31 | hilo.join(); 32 | 33 | for (int i = 0; i < MAXIMO; i++) { 34 | System.out.println("Hola, soy el hilo 2"); 35 | Thread.sleep(100); 36 | } 37 | } catch (InterruptedException ie) {} 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /HilosSincronizar/src/org/sfsoft/hilos_sincronizar/Hilos_Sincronizar.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que muestra como sincronizar dos hilos de forma 5 | * que un hilo espera a otro hilo para ejecutarse en orden 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Hilos_Sincronizar { 10 | 11 | /* 12 | * Lanza los dos hilos. 13 | * hilo2 espera a que termine hilo1 para empezar 14 | */ 15 | public static void main(String[] args) { 16 | 17 | Hilo1 hilo1 = new Hilo1(); 18 | Hilo2 hilo2 = new Hilo2(hilo1); 19 | 20 | hilo1.start(); 21 | hilo2.start(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/.name: -------------------------------------------------------------------------------- 1 | Hilos_Sincronizar2 -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /HilosSincronizar2/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HilosSincronizar2/Hilos_Sincronizar2.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /HilosSincronizar2/src/org/sfsoft/hilos_sincronizar/Hilo1.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que representa a un hilo 5 | * @author Santiago Faci 6 | * @version curso 2014-2015 7 | * 8 | */ 9 | public class Hilo1 extends Thread { 10 | 11 | private final static int MAXIMO = 10; 12 | 13 | /* 14 | * Tarea que desempeña el hilo. En este caso de forma simbólica 15 | * pinta una serie de líneas por pantalla 16 | * @see java.lang.Thread#run() 17 | */ 18 | @Override 19 | public void run() { 20 | 21 | try { 22 | for (int i = 0; i < MAXIMO; i++) { 23 | System.out.println("Hola, soy el hilo 1"); 24 | Thread.sleep(500); 25 | } 26 | } catch (InterruptedException ie) {} 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /HilosSincronizar2/src/org/sfsoft/hilos_sincronizar/Hilo2.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que representa a un hilo que debe ejecutarse 5 | * de forma ininterrumpida mientras dure la ejecución de otro hilo 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | * 9 | */ 10 | public class Hilo2 extends Thread { 11 | 12 | // Hilo al que deberá esperar 13 | private Thread hilo; 14 | 15 | public Hilo2(Thread hilo) { 16 | this.hilo = hilo; 17 | } 18 | 19 | /* 20 | * Tarea que desempeña el hilo. En este caso de forma simbólica 21 | * pinta una serie de líneas por pantalla 22 | * @see java.lang.Thread#run() 23 | */ 24 | @Override 25 | public void run() { 26 | 27 | try { 28 | while (hilo.isAlive()) { 29 | System.out.println("Hola, soy el hilo 2"); 30 | Thread.sleep(100); 31 | } 32 | } catch (InterruptedException ie) {} 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /HilosSincronizar2/src/org/sfsoft/hilos_sincronizar/Hilos_Sincronizar.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_sincronizar; 2 | 3 | /** 4 | * Clase que muestra como sincronizar dos hilos de forma 5 | * que un hilo se ejecute mientras dure la ejecución de un primer hilo 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Hilos_Sincronizar { 10 | 11 | /* 12 | * Lanza los dos hilos. 13 | * hilo2 espera a que termine hilo1 para empezar 14 | * También muestra el tiempo en el que ambos hilos terminan, que tendrá que coincidir 15 | */ 16 | public static void main(String[] args) { 17 | 18 | Hilo1 hilo1 = new Hilo1(); 19 | Hilo2 hilo2 = new Hilo2(hilo1); 20 | long tiempo = 0; 21 | 22 | // Almacena el instante de tiempo en que se lanzan los hilos 23 | tiempo = System.currentTimeMillis(); 24 | hilo1.start(); 25 | hilo2.start(); 26 | 27 | // El hilo principal espera a que terminen los dos hilos, que lo harán al mismo tiempo 28 | // puesto que hilo2 se ejecuta mientras hilo1 lo haga 29 | 30 | try { 31 | hilo1.join(); 32 | // Muestra el tiempo pasado desde que se inició el hilo 33 | System.out.println("Fin hilo1: " + ((System.currentTimeMillis() - tiempo)) + " ms"); 34 | 35 | hilo2.join(); 36 | } catch (InterruptedException ie) {} 37 | 38 | // Muestra el tiempo pasado desde que se inició el hilo 39 | System.out.println("Fin hilo2: " + ((System.currentTimeMillis() - tiempo)) + " ms"); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/.name: -------------------------------------------------------------------------------- 1 | Hilos_Compartir -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Hilos_Compartir/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Hilos_Compartir/Hilos_Compartir.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Hilos_Compartir/src/org/sfsoft/hilos_compartir/Hilo.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_compartir; 2 | 3 | 4 | /** 5 | * Clase que representa a un hilo 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | * 9 | */ 10 | public class Hilo extends Thread { 11 | 12 | private final static int MAXIMO = 10; 13 | private Recurso recurso; 14 | 15 | public Hilo(Recurso recurso) { 16 | this.recurso = recurso; 17 | } 18 | /* 19 | * Tarea que desempeña el hilo. En este caso de forma simbólica 20 | * pinta una serie de líneas por pantalla 21 | * @see java.lang.Thread#run() 22 | */ 23 | @Override 24 | public void run() { 25 | 26 | String dato = null; 27 | 28 | try { 29 | do { 30 | dato = recurso.utilizar(); 31 | if (dato != null) 32 | System.out.println(getName() + " - " + dato); 33 | } while (dato != null); 34 | 35 | } catch (InterruptedException ie) {} 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Hilos_Compartir/src/org/sfsoft/hilos_compartir/Hilos_Compartir.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_compartir; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * Clase que muestra como compartir un recurso entre dos hilos 7 | * @author Santiago Faci 8 | * @version curso 2014-2015 9 | */ 10 | public class Hilos_Compartir { 11 | 12 | private final static int CANTIDAD = 20; 13 | 14 | /* 15 | * Lanza varios hilos que utilizan información de un mismo recurso compartido 16 | */ 17 | public static void main(String[] args) { 18 | 19 | ArrayList datos = new ArrayList(); 20 | Recurso recurso = new Recurso(datos); 21 | Hilo hilo1 = new Hilo(recurso); 22 | Hilo hilo2 = new Hilo(recurso); 23 | Hilo hilo3 = new Hilo(recurso); 24 | Hilo hilo4 = new Hilo(recurso); 25 | 26 | // Genera datos para el recurso compartido 27 | for (int i = 0; i < CANTIDAD; i++) { 28 | datos.add(String.valueOf(i)); 29 | } 30 | 31 | hilo1.start(); 32 | hilo2.start(); 33 | hilo3.start(); 34 | hilo4.start(); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Hilos_Compartir/src/org/sfsoft/hilos_compartir/Recurso.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.hilos_compartir; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * Clase que representa un recurso de datos al que varios hilos 7 | * deben acceder de forma concurrente 8 | * @author Santiago Faci 9 | * @version curso 2014-2015 10 | * 11 | */ 12 | public class Recurso { 13 | 14 | private ArrayList datos; 15 | 16 | /** 17 | * Constructor 18 | * @param datos del recurso compartido 19 | */ 20 | public Recurso(ArrayList datos) { 21 | this.datos = datos; 22 | } 23 | 24 | /** 25 | * Saca el último dato disponible del recurso compartido 26 | * El método se marca como sincronizado para que solamente un hilo al mismo tiempo pueda invocarlo 27 | * 28 | * Simulamos que obtener el dato conlleva cierto tiempo de procesamiento (con un sleep) y de esa manera podemos 29 | * comprobar la diferencia entre hacer el método sincronizado y no hacerlo 30 | * @return El dato que saca del recurso 31 | */ 32 | public synchronized String utilizar() throws InterruptedException { 33 | 34 | String dato = null; 35 | 36 | if (datos.size() > 0) { 37 | 38 | Thread.sleep(200); 39 | dato = datos.remove(datos.size() - 1); 40 | } 41 | 42 | return dato; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/.name: -------------------------------------------------------------------------------- 1 | HolaHiloRunnable -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /HolaHiloRunnable/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HolaHiloRunnable/HolaHiloRunnable.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /HolaHiloRunnable/src/org/sfsoft/holahilo2/HolaHiloRunnable.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.holahilo2; 2 | 3 | /** 4 | * Clase principal 5 | * Lanzamos dos hilos y comprobamos como se ejecutan de forma concurrente 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class HolaHiloRunnable { 10 | 11 | public static void main(String args[]) { 12 | 13 | TareaRunnable tarea1 = new TareaRunnable("Hilo1"); 14 | TareaRunnable tarea2 = new TareaRunnable("Hilo2"); 15 | 16 | Thread hilo1 = new Thread(tarea1); 17 | Thread hilo2 = new Thread(tarea2); 18 | 19 | hilo1.start(); 20 | hilo2.start(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /HolaHiloRunnable/src/org/sfsoft/holahilo2/TareaRunnable.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.holahilo2; 2 | 3 | /** 4 | * Clase que define la tarea que ejecutará el hilo 5 | * En este caso implementamos la clase implementando el interfaz Runnable 6 | * Utilizaremos esta manera de crear hilos cuando nuestra clase ya esté heredando (por necesidades de diseño) de otra clase 7 | * @author Santiago Faci 8 | * @version 2014-2015 9 | */ 10 | public class TareaRunnable implements Runnable { 11 | 12 | private String nombre; 13 | private static int MAXIMO = 10; 14 | 15 | public TareaRunnable(String nombre) { 16 | this.nombre = nombre; 17 | } 18 | 19 | /** 20 | * En este método se define la tarea que realizará el hilo 21 | * En este caso mostrará un mensaje un número determinado de veces 22 | * @see java.lang.Thread#run() 23 | */ 24 | @Override 25 | public void run() { 26 | 27 | try { 28 | for (int i = 0; i < MAXIMO; i++) { 29 | 30 | System.out.println("Hola! soy el hilo " + nombre); 31 | Thread.sleep(500); 32 | } 33 | } catch (InterruptedException ie) { 34 | ie.printStackTrace(); 35 | } 36 | } 37 | } 38 | 39 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/.name: -------------------------------------------------------------------------------- 1 | HolaHiloThread -------------------------------------------------------------------------------- /HolaHiloThread/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1.7 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /HolaHiloThread/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HolaHiloThread/HolaHiloThread.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /HolaHiloThread/src/org/sfsoft/holahilo/Hilo.java: -------------------------------------------------------------------------------- 1 | package org.sfsoft.holahilo; 2 | 3 | /** 4 | * Clase que define el hilo y la tarea que éste realiza 5 | * En este caso implementamos el hilo creando una clase que hereda de la clase Thread 6 | * @author Santiago Faci 7 | * @version curso 2014-2015 8 | */ 9 | public class Hilo extends Thread { 10 | 11 | private static int MAXIMO = 10; 12 | 13 | /** 14 | * En este método se define la tarea que realizará el hilo 15 | * En este caso mostrará un mensaje un número determinado de veces 16 | * @see java.lang.Thread#run() 17 | */ 18 | @Override 19 | public void run() { 20 | 21 | try { 22 | for (int i = 0; i < MAXIMO; i++) { 23 | 24 | System.out.println("Hola! soy el hilo " + this.getName()); 25 | Thread.sleep(500); 26 | } 27 | } catch (InterruptedException ie) { 28 | ie.printStackTrace(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /HolaHiloThread/src/org/sfsoft/holahilo/HolaHiloThread.java: -------------------------------------------------------------------------------- 1 | 2 | package org.sfsoft.holahilo; 3 | 4 | /** 5 | * Clase principal 6 | * Lanzamos dos hilos y comprobamos como se ejecutan de forma concurrente 7 | * @author Santiago Faci 8 | * @version curso 2014-2015 9 | */ 10 | public class HolaHiloThread { 11 | 12 | public static void main(String args[]) { 13 | 14 | Hilo hilo1 = new Hilo(); 15 | Hilo hilo2 = new Hilo(); 16 | 17 | // También se pueden crear hilos declarando un objeto Thead e implementando el método run "al vuelo" 18 | Thread hilo3 = new Thread(){ 19 | @Override 20 | public void run() { 21 | try { 22 | for (int i = 0; i < 10; i++) { 23 | 24 | System.out.println("Hola! soy el hilo " + this.getName()); 25 | Thread.sleep(500); 26 | } 27 | } catch (InterruptedException ie) { 28 | ie.printStackTrace(); 29 | } 30 | } 31 | }; 32 | 33 | // Lanza la ejecución de los dos hilos 34 | // Una vez que se lanza un hilo, su ejecución pasa a segundo plano 35 | hilo1.start(); 36 | hilo2.start(); 37 | hilo3.start(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /MultidescargaFx/dlc.txt: -------------------------------------------------------------------------------- 1 | https://git.kernel.org/torvalds/t/linux-5.10-rc5.tar.gz 2 | https://git.kernel.org/torvalds/t/linux-5.10-rc5.tar.gz 3 | https://git.kernel.org/torvalds/t/linux-5.10-rc5.tar.gz 4 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/java/com/svalero/downloader/App.java: -------------------------------------------------------------------------------- 1 | package com.svalero.downloader; 2 | 3 | import com.svalero.downloader.controller.AppController; 4 | import com.svalero.downloader.util.R; 5 | import javafx.application.Application; 6 | import javafx.fxml.FXMLLoader; 7 | import javafx.scene.Scene; 8 | import javafx.scene.control.ScrollPane; 9 | import javafx.stage.Stage; 10 | 11 | public class App extends Application { 12 | 13 | @Override 14 | public void init() throws Exception { 15 | super.init(); 16 | } 17 | 18 | @Override 19 | public void start(Stage stage) throws Exception { 20 | FXMLLoader loader = new FXMLLoader(); 21 | loader.setLocation(R.getUI("multidownload.fxml")); 22 | loader.setController(new AppController()); 23 | ScrollPane vbox = loader.load(); 24 | 25 | Scene scene = new Scene(vbox); 26 | stage.setScene(scene); 27 | stage.setTitle("Downloader"); 28 | stage.show(); 29 | } 30 | 31 | @Override 32 | public void stop() throws Exception { 33 | super.stop(); 34 | } 35 | 36 | public static void main(String[] args) { 37 | launch(); 38 | } 39 | } 40 | 41 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/java/com/svalero/downloader/controller/AppController.java: -------------------------------------------------------------------------------- 1 | package com.svalero.downloader.controller; 2 | 3 | import com.svalero.downloader.util.R; 4 | import javafx.event.ActionEvent; 5 | import javafx.fxml.FXML; 6 | import javafx.fxml.FXMLLoader; 7 | import javafx.scene.control.Button; 8 | import javafx.scene.control.Tab; 9 | import javafx.scene.control.TabPane; 10 | import javafx.scene.control.TextField; 11 | import javafx.scene.layout.VBox; 12 | 13 | import java.io.IOException; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | 18 | public class AppController { 19 | 20 | public TextField tfUrl; 21 | public Button btDownload; 22 | public TabPane tpDownloads; 23 | 24 | private Map allDownloads; 25 | 26 | public AppController() { 27 | allDownloads = new HashMap<>(); 28 | } 29 | 30 | @FXML 31 | public void launchDownload(ActionEvent event) { 32 | String urlText = tfUrl.getText(); 33 | tfUrl.clear(); 34 | tfUrl.requestFocus(); 35 | 36 | launchDownload(urlText); 37 | } 38 | 39 | private void launchDownload(String url) { 40 | try { 41 | FXMLLoader loader = new FXMLLoader(); 42 | loader.setLocation(R.getUI("download.fxml")); 43 | 44 | DownloadController downloadController = new DownloadController(url); 45 | loader.setController(downloadController); 46 | VBox downloadBox = loader.load(); 47 | 48 | String filename = url.substring(url.lastIndexOf("/") + 1); 49 | tpDownloads.getTabs().add(new Tab(filename, downloadBox)); 50 | 51 | allDownloads.put(url, downloadController); 52 | } catch (IOException ioe) { 53 | ioe.printStackTrace(); 54 | } 55 | } 56 | 57 | @FXML 58 | public void stopAllDownloads() { 59 | for (DownloadController downloadController : allDownloads.values()) 60 | downloadController.stop(); 61 | } 62 | 63 | @FXML 64 | public void readDLC() { 65 | // Pedir el fichero al usuario (FileChooser) 66 | 67 | // Leo el fichero y cargo cada linea en un List (clase Files) 68 | 69 | // Para cada linea, llamar al método launchDownload 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/java/com/svalero/downloader/task/DownloadTask.java: -------------------------------------------------------------------------------- 1 | package com.svalero.downloader.task; 2 | 3 | import com.svalero.downloader.controller.DownloadController; 4 | import javafx.concurrent.Task; 5 | import org.apache.logging.log4j.LogManager; 6 | import org.apache.logging.log4j.Logger; 7 | 8 | import java.io.BufferedInputStream; 9 | import java.io.File; 10 | import java.io.FileOutputStream; 11 | import java.net.MalformedURLException; 12 | import java.net.URL; 13 | import java.net.URLConnection; 14 | 15 | public class DownloadTask extends Task { 16 | 17 | private URL url; 18 | private File file; 19 | 20 | private static final Logger logger = LogManager.getLogger(DownloadController.class); 21 | 22 | public DownloadTask(String urlText, File file) throws MalformedURLException { 23 | this.url = new URL(urlText); 24 | this.file = file; 25 | } 26 | 27 | @Override 28 | protected Integer call() throws Exception { 29 | logger.trace("Descarga " + url.toString() + " iniciada"); 30 | updateMessage("Conectando con el servidor . . ."); 31 | 32 | URLConnection urlConnection = url.openConnection(); 33 | double fileSize = urlConnection.getContentLength(); 34 | BufferedInputStream in = new BufferedInputStream(url.openStream()); 35 | FileOutputStream fileOutputStream = new FileOutputStream(file); 36 | byte dataBuffer[] = new byte[1024]; 37 | int bytesRead; 38 | int totalRead = 0; 39 | double downloadProgress = 0; 40 | 41 | while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { 42 | downloadProgress = ((double) totalRead / fileSize); 43 | updateProgress(downloadProgress, 1); 44 | updateMessage(downloadProgress * 100 + " %"); 45 | 46 | fileOutputStream.write(dataBuffer, 0, bytesRead); 47 | totalRead += bytesRead; 48 | 49 | if (isCancelled()) { 50 | logger.trace("Descarga " + url.toString() + " cancelada"); 51 | return null; 52 | } 53 | } 54 | 55 | updateProgress(1, 1); 56 | updateMessage("100 %"); 57 | 58 | logger.trace("Descarga " + url.toString() + " finalizada"); 59 | return null; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/java/com/svalero/downloader/util/R.java: -------------------------------------------------------------------------------- 1 | package com.svalero.downloader.util; 2 | 3 | import java.io.File; 4 | import java.io.InputStream; 5 | import java.net.URL; 6 | 7 | public class R { 8 | 9 | public static InputStream getImage(String name) { 10 | return Thread.currentThread().getContextClassLoader().getResourceAsStream("images" + File.separator + name); 11 | } 12 | 13 | public static URL getUI(String name) { 14 | return Thread.currentThread().getContextClassLoader().getResource("ui" + File.separator + name); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /MultidescargaFx/src/main/resources/ui/download.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |