feat: Tareas hechas.
This commit is contained in:
parent
4f158e3c4b
commit
3d484fa7f4
73
Ejercicio_1/TareaProductorBufferConsumidor/build.xml
Normal file
73
Ejercicio_1/TareaProductorBufferConsumidor/build.xml
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See commented blocks below for -->
|
||||||
|
<!-- some examples of how to customize the build. -->
|
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||||
|
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||||
|
<!-- the Compile on Save feature is turned off for the project. -->
|
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||||
|
<!-- in the project's Project Properties dialog box.-->
|
||||||
|
<project name="TareaProductorBufferConsumidor" default="default" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project TareaProductorBufferConsumidor.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
There exist several targets which are by default empty and which can be
|
||||||
|
used for execution of your tasks. These targets are usually executed
|
||||||
|
before and after some main targets. They are:
|
||||||
|
|
||||||
|
-pre-init: called before initialization of project properties
|
||||||
|
-post-init: called after initialization of project properties
|
||||||
|
-pre-compile: called before javac compilation
|
||||||
|
-post-compile: called after javac compilation
|
||||||
|
-pre-compile-single: called before javac compilation of single file
|
||||||
|
-post-compile-single: called after javac compilation of single file
|
||||||
|
-pre-compile-test: called before javac compilation of JUnit tests
|
||||||
|
-post-compile-test: called after javac compilation of JUnit tests
|
||||||
|
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||||
|
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||||
|
-pre-jar: called before JAR building
|
||||||
|
-post-jar: called after JAR building
|
||||||
|
-post-clean: called after cleaning build products
|
||||||
|
|
||||||
|
(Targets beginning with '-' are not intended to be called on their own.)
|
||||||
|
|
||||||
|
Example of inserting an obfuscator after compilation could look like this:
|
||||||
|
|
||||||
|
<target name="-post-compile">
|
||||||
|
<obfuscate>
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
</obfuscate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
For list of available properties check the imported
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
|
||||||
|
Another way to customize the build is by overriding existing main targets.
|
||||||
|
The targets of interest are:
|
||||||
|
|
||||||
|
-init-macrodef-javac: defines macro for javac compilation
|
||||||
|
-init-macrodef-junit: defines macro for junit execution
|
||||||
|
-init-macrodef-debug: defines macro for class debugging
|
||||||
|
-init-macrodef-java: defines macro for class execution
|
||||||
|
-do-jar: JAR building
|
||||||
|
run: execution of project
|
||||||
|
-javadoc-build: Javadoc generation
|
||||||
|
test-report: JUnit report generation
|
||||||
|
|
||||||
|
An example of overriding the target for project execution could look like this:
|
||||||
|
|
||||||
|
<target name="run" depends="TareaProductorBufferConsumidor-impl.jar">
|
||||||
|
<exec dir="bin" executable="launcher.exe">
|
||||||
|
<arg file="${dist.jar}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
Notice that the overridden target depends on the jar target and not only on
|
||||||
|
the compile target as the regular run target does. Again, for a list of available
|
||||||
|
properties which you can use, check the target you are overriding in the
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
-->
|
||||||
|
</project>
|
@ -0,0 +1,4 @@
|
|||||||
|
#Mon, 04 Mar 2024 23:36:01 +0100
|
||||||
|
|
||||||
|
|
||||||
|
/home/DAM2024/PSP02_Tarea/Ejercicio_1/TareaProductorBufferConsumidor=
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
32
Ejercicio_1/TareaProductorBufferConsumidor/dist/README.TXT
vendored
Normal file
32
Ejercicio_1/TareaProductorBufferConsumidor/dist/README.TXT
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
========================
|
||||||
|
BUILD OUTPUT DESCRIPTION
|
||||||
|
========================
|
||||||
|
|
||||||
|
When you build an Java application project that has a main class, the IDE
|
||||||
|
automatically copies all of the JAR
|
||||||
|
files on the projects classpath to your projects dist/lib folder. The IDE
|
||||||
|
also adds each of the JAR files to the Class-Path element in the application
|
||||||
|
JAR files manifest file (MANIFEST.MF).
|
||||||
|
|
||||||
|
To run the project from the command line, go to the dist folder and
|
||||||
|
type the following:
|
||||||
|
|
||||||
|
java -jar "TareaProductorBufferConsumidor.jar"
|
||||||
|
|
||||||
|
To distribute this project, zip up the dist folder (including the lib folder)
|
||||||
|
and distribute the ZIP file.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
* If two JAR files on the project classpath have the same name, only the first
|
||||||
|
JAR file is copied to the lib folder.
|
||||||
|
* Only JAR files are copied to the lib folder.
|
||||||
|
If the classpath contains other types of files or folders, these files (folders)
|
||||||
|
are not copied.
|
||||||
|
* If a library on the projects classpath also has a Class-Path element
|
||||||
|
specified in the manifest,the content of the Class-Path element has to be on
|
||||||
|
the projects runtime path.
|
||||||
|
* To set a main class in a standard Java project, right-click the project node
|
||||||
|
in the Projects window and choose Properties. Then click Run and enter the
|
||||||
|
class name in the Main Class field. Alternatively, you can manually type the
|
||||||
|
class name in the manifest Main-Class element.
|
BIN
Ejercicio_1/TareaProductorBufferConsumidor/dist/TareaProductorBufferConsumidor.jar
vendored
Normal file
BIN
Ejercicio_1/TareaProductorBufferConsumidor/dist/TareaProductorBufferConsumidor.jar
vendored
Normal file
Binary file not shown.
3
Ejercicio_1/TareaProductorBufferConsumidor/manifest.mf
Normal file
3
Ejercicio_1/TareaProductorBufferConsumidor/manifest.mf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
X-COMMENT: Main-Class will be added automatically by build
|
||||||
|
|
1771
Ejercicio_1/TareaProductorBufferConsumidor/nbproject/build-impl.xml
Normal file
1771
Ejercicio_1/TareaProductorBufferConsumidor/nbproject/build-impl.xml
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
|
|||||||
|
build.xml.data.CRC32=abda8551
|
||||||
|
build.xml.script.CRC32=3e1ca100
|
||||||
|
build.xml.stylesheet.CRC32=f85dc8f2@1.110.0.48
|
||||||
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
|
nbproject/build-impl.xml.data.CRC32=abda8551
|
||||||
|
nbproject/build-impl.xml.script.CRC32=cb2ad89a
|
||||||
|
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.110.0.48
|
@ -0,0 +1,2 @@
|
|||||||
|
compile.on.save=true
|
||||||
|
user.properties.file=/home/kyman/snap/netbeans/93/build.properties
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||||
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||||
|
<group>
|
||||||
|
<file>file:/home/DAM2024/PSP02_Tarea/Ejercicio_1/TareaProductorBufferConsumidor/src/tareaproductorbufferconsumidor/TareaProductorBufferConsumidor.java</file>
|
||||||
|
</group>
|
||||||
|
</open-files>
|
||||||
|
</project-private>
|
@ -0,0 +1,95 @@
|
|||||||
|
annotation.processing.enabled=true
|
||||||
|
annotation.processing.enabled.in.editor=false
|
||||||
|
annotation.processing.processor.options=
|
||||||
|
annotation.processing.processors.list=
|
||||||
|
annotation.processing.run.all.processors=true
|
||||||
|
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||||
|
build.classes.dir=${build.dir}/classes
|
||||||
|
build.classes.excludes=**/*.java,**/*.form
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
build.dir=build
|
||||||
|
build.generated.dir=${build.dir}/generated
|
||||||
|
build.generated.sources.dir=${build.dir}/generated-sources
|
||||||
|
# Only compile against the classpath explicitly listed here:
|
||||||
|
build.sysclasspath=ignore
|
||||||
|
build.test.classes.dir=${build.dir}/test/classes
|
||||||
|
build.test.results.dir=${build.dir}/test/results
|
||||||
|
# Uncomment to specify the preferred debugger connection transport:
|
||||||
|
#debug.transport=dt_socket
|
||||||
|
debug.classpath=\
|
||||||
|
${run.classpath}
|
||||||
|
debug.modulepath=\
|
||||||
|
${run.modulepath}
|
||||||
|
debug.test.classpath=\
|
||||||
|
${run.test.classpath}
|
||||||
|
debug.test.modulepath=\
|
||||||
|
${run.test.modulepath}
|
||||||
|
# Files in build.classes.dir which should be excluded from distribution jar
|
||||||
|
dist.archive.excludes=
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
dist.dir=dist
|
||||||
|
dist.jar=${dist.dir}/TareaProductorBufferConsumidor.jar
|
||||||
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
|
dist.jlink.dir=${dist.dir}/jlink
|
||||||
|
dist.jlink.output=${dist.jlink.dir}/TareaProductorBufferConsumidor
|
||||||
|
excludes=
|
||||||
|
includes=**
|
||||||
|
jar.compress=false
|
||||||
|
javac.classpath=
|
||||||
|
# Space-separated list of extra javac options
|
||||||
|
javac.compilerargs=
|
||||||
|
javac.deprecation=false
|
||||||
|
javac.external.vm=true
|
||||||
|
javac.modulepath=
|
||||||
|
javac.processormodulepath=
|
||||||
|
javac.processorpath=\
|
||||||
|
${javac.classpath}
|
||||||
|
javac.source=19
|
||||||
|
javac.target=19
|
||||||
|
javac.test.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
javac.test.modulepath=\
|
||||||
|
${javac.modulepath}
|
||||||
|
javac.test.processorpath=\
|
||||||
|
${javac.test.classpath}
|
||||||
|
javadoc.additionalparam=
|
||||||
|
javadoc.author=false
|
||||||
|
javadoc.encoding=${source.encoding}
|
||||||
|
javadoc.html5=false
|
||||||
|
javadoc.noindex=false
|
||||||
|
javadoc.nonavbar=false
|
||||||
|
javadoc.notree=false
|
||||||
|
javadoc.private=false
|
||||||
|
javadoc.splitindex=true
|
||||||
|
javadoc.use=true
|
||||||
|
javadoc.version=false
|
||||||
|
javadoc.windowtitle=
|
||||||
|
# The jlink additional root modules to resolve
|
||||||
|
jlink.additionalmodules=
|
||||||
|
# The jlink additional command line parameters
|
||||||
|
jlink.additionalparam=
|
||||||
|
jlink.launcher=true
|
||||||
|
jlink.launcher.name=TareaProductorBufferConsumidor
|
||||||
|
main.class=tareaproductorbufferconsumidor.TareaProductorBufferConsumidor
|
||||||
|
manifest.file=manifest.mf
|
||||||
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
|
mkdist.disabled=false
|
||||||
|
platform.active=default_platform
|
||||||
|
run.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
# Space-separated list of JVM arguments used when running the project.
|
||||||
|
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
|
||||||
|
# To set system properties for unit tests define test-sys-prop.name=value:
|
||||||
|
run.jvmargs=
|
||||||
|
run.modulepath=\
|
||||||
|
${javac.modulepath}
|
||||||
|
run.test.classpath=\
|
||||||
|
${javac.test.classpath}:\
|
||||||
|
${build.test.classes.dir}
|
||||||
|
run.test.modulepath=\
|
||||||
|
${javac.test.modulepath}
|
||||||
|
source.encoding=UTF-8
|
||||||
|
src.dir=src
|
||||||
|
test.src.dir=test
|
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.java.j2seproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<name>TareaProductorBufferConsumidor</name>
|
||||||
|
<source-roots>
|
||||||
|
<root id="src.dir"/>
|
||||||
|
</source-roots>
|
||||||
|
<test-roots>
|
||||||
|
<root id="test.src.dir"/>
|
||||||
|
</test-roots>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
|
||||||
|
*/
|
||||||
|
package tareaproductorbufferconsumidor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author kyman
|
||||||
|
*/
|
||||||
|
public class TareaProductorBufferConsumidor {
|
||||||
|
|
||||||
|
// Configuración.
|
||||||
|
private static final int longitud_limite_producto = 15;
|
||||||
|
private static final int longitud_maxima_buffer = 6;
|
||||||
|
// Configuración.
|
||||||
|
|
||||||
|
private static boolean trabajando = true;
|
||||||
|
private static final ArrayList<String> buffer = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO code application logic here
|
||||||
|
|
||||||
|
new Thread(new Runnable(){
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
String producto = "";
|
||||||
|
|
||||||
|
while(trabajando && producto.length() < longitud_limite_producto)
|
||||||
|
if(!buffer.isEmpty()){
|
||||||
|
|
||||||
|
String caracter = buffer.remove(0);
|
||||||
|
|
||||||
|
producto += caracter;
|
||||||
|
System.out.println("Utilizado el caracter '" + caracter + "'.");
|
||||||
|
|
||||||
|
if(producto.length() == longitud_limite_producto)
|
||||||
|
trabajando = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("El productor terminó su tarea con el producto '" + producto + "'.");
|
||||||
|
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
new Thread(new Runnable(){
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while(trabajando)
|
||||||
|
if(buffer.size() < longitud_maxima_buffer){
|
||||||
|
|
||||||
|
String caracter = String.valueOf((char)(65 + (int)(Math.random() * 26)));
|
||||||
|
|
||||||
|
buffer.add(caracter);
|
||||||
|
System.out.println("Añadido el nuevo caracter '" + caracter + "'.");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
73
Ejercicio_2/TareaCenaFilosofos/build.xml
Normal file
73
Ejercicio_2/TareaCenaFilosofos/build.xml
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See commented blocks below for -->
|
||||||
|
<!-- some examples of how to customize the build. -->
|
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||||
|
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||||
|
<!-- the Compile on Save feature is turned off for the project. -->
|
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||||
|
<!-- in the project's Project Properties dialog box.-->
|
||||||
|
<project name="TareaCenaFilosofos" default="default" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project TareaCenaFilosofos.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
There exist several targets which are by default empty and which can be
|
||||||
|
used for execution of your tasks. These targets are usually executed
|
||||||
|
before and after some main targets. They are:
|
||||||
|
|
||||||
|
-pre-init: called before initialization of project properties
|
||||||
|
-post-init: called after initialization of project properties
|
||||||
|
-pre-compile: called before javac compilation
|
||||||
|
-post-compile: called after javac compilation
|
||||||
|
-pre-compile-single: called before javac compilation of single file
|
||||||
|
-post-compile-single: called after javac compilation of single file
|
||||||
|
-pre-compile-test: called before javac compilation of JUnit tests
|
||||||
|
-post-compile-test: called after javac compilation of JUnit tests
|
||||||
|
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||||
|
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||||
|
-pre-jar: called before JAR building
|
||||||
|
-post-jar: called after JAR building
|
||||||
|
-post-clean: called after cleaning build products
|
||||||
|
|
||||||
|
(Targets beginning with '-' are not intended to be called on their own.)
|
||||||
|
|
||||||
|
Example of inserting an obfuscator after compilation could look like this:
|
||||||
|
|
||||||
|
<target name="-post-compile">
|
||||||
|
<obfuscate>
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
</obfuscate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
For list of available properties check the imported
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
|
||||||
|
Another way to customize the build is by overriding existing main targets.
|
||||||
|
The targets of interest are:
|
||||||
|
|
||||||
|
-init-macrodef-javac: defines macro for javac compilation
|
||||||
|
-init-macrodef-junit: defines macro for junit execution
|
||||||
|
-init-macrodef-debug: defines macro for class debugging
|
||||||
|
-init-macrodef-java: defines macro for class execution
|
||||||
|
-do-jar: JAR building
|
||||||
|
run: execution of project
|
||||||
|
-javadoc-build: Javadoc generation
|
||||||
|
test-report: JUnit report generation
|
||||||
|
|
||||||
|
An example of overriding the target for project execution could look like this:
|
||||||
|
|
||||||
|
<target name="run" depends="TareaCenaFilosofos-impl.jar">
|
||||||
|
<exec dir="bin" executable="launcher.exe">
|
||||||
|
<arg file="${dist.jar}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
Notice that the overridden target depends on the jar target and not only on
|
||||||
|
the compile target as the regular run target does. Again, for a list of available
|
||||||
|
properties which you can use, check the target you are overriding in the
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
-->
|
||||||
|
</project>
|
@ -0,0 +1,4 @@
|
|||||||
|
#Mon, 04 Mar 2024 23:47:48 +0100
|
||||||
|
|
||||||
|
|
||||||
|
/home/DAM2024/PSP02_Tarea/Ejercicio_2/TareaCenaFilosofos=
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
32
Ejercicio_2/TareaCenaFilosofos/dist/README.TXT
vendored
Normal file
32
Ejercicio_2/TareaCenaFilosofos/dist/README.TXT
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
========================
|
||||||
|
BUILD OUTPUT DESCRIPTION
|
||||||
|
========================
|
||||||
|
|
||||||
|
When you build an Java application project that has a main class, the IDE
|
||||||
|
automatically copies all of the JAR
|
||||||
|
files on the projects classpath to your projects dist/lib folder. The IDE
|
||||||
|
also adds each of the JAR files to the Class-Path element in the application
|
||||||
|
JAR files manifest file (MANIFEST.MF).
|
||||||
|
|
||||||
|
To run the project from the command line, go to the dist folder and
|
||||||
|
type the following:
|
||||||
|
|
||||||
|
java -jar "TareaCenaFilosofos.jar"
|
||||||
|
|
||||||
|
To distribute this project, zip up the dist folder (including the lib folder)
|
||||||
|
and distribute the ZIP file.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
* If two JAR files on the project classpath have the same name, only the first
|
||||||
|
JAR file is copied to the lib folder.
|
||||||
|
* Only JAR files are copied to the lib folder.
|
||||||
|
If the classpath contains other types of files or folders, these files (folders)
|
||||||
|
are not copied.
|
||||||
|
* If a library on the projects classpath also has a Class-Path element
|
||||||
|
specified in the manifest,the content of the Class-Path element has to be on
|
||||||
|
the projects runtime path.
|
||||||
|
* To set a main class in a standard Java project, right-click the project node
|
||||||
|
in the Projects window and choose Properties. Then click Run and enter the
|
||||||
|
class name in the Main Class field. Alternatively, you can manually type the
|
||||||
|
class name in the manifest Main-Class element.
|
BIN
Ejercicio_2/TareaCenaFilosofos/dist/TareaCenaFilosofos.jar
vendored
Normal file
BIN
Ejercicio_2/TareaCenaFilosofos/dist/TareaCenaFilosofos.jar
vendored
Normal file
Binary file not shown.
3
Ejercicio_2/TareaCenaFilosofos/manifest.mf
Normal file
3
Ejercicio_2/TareaCenaFilosofos/manifest.mf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
X-COMMENT: Main-Class will be added automatically by build
|
||||||
|
|
1771
Ejercicio_2/TareaCenaFilosofos/nbproject/build-impl.xml
Normal file
1771
Ejercicio_2/TareaCenaFilosofos/nbproject/build-impl.xml
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
|
|||||||
|
build.xml.data.CRC32=65753281
|
||||||
|
build.xml.script.CRC32=a47445f8
|
||||||
|
build.xml.stylesheet.CRC32=f85dc8f2@1.110.0.48
|
||||||
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
|
nbproject/build-impl.xml.data.CRC32=65753281
|
||||||
|
nbproject/build-impl.xml.script.CRC32=8cf7ad61
|
||||||
|
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.110.0.48
|
@ -0,0 +1,2 @@
|
|||||||
|
compile.on.save=true
|
||||||
|
user.properties.file=/home/kyman/snap/netbeans/93/build.properties
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||||
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||||
|
<group>
|
||||||
|
<file>file:/home/DAM2024/PSP02_Tarea/Ejercicio_2/TareaCenaFilosofos/src/tareacenafilosofos/TareaCenaFilosofos.java</file>
|
||||||
|
</group>
|
||||||
|
</open-files>
|
||||||
|
</project-private>
|
95
Ejercicio_2/TareaCenaFilosofos/nbproject/project.properties
Normal file
95
Ejercicio_2/TareaCenaFilosofos/nbproject/project.properties
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
annotation.processing.enabled=true
|
||||||
|
annotation.processing.enabled.in.editor=false
|
||||||
|
annotation.processing.processor.options=
|
||||||
|
annotation.processing.processors.list=
|
||||||
|
annotation.processing.run.all.processors=true
|
||||||
|
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||||
|
build.classes.dir=${build.dir}/classes
|
||||||
|
build.classes.excludes=**/*.java,**/*.form
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
build.dir=build
|
||||||
|
build.generated.dir=${build.dir}/generated
|
||||||
|
build.generated.sources.dir=${build.dir}/generated-sources
|
||||||
|
# Only compile against the classpath explicitly listed here:
|
||||||
|
build.sysclasspath=ignore
|
||||||
|
build.test.classes.dir=${build.dir}/test/classes
|
||||||
|
build.test.results.dir=${build.dir}/test/results
|
||||||
|
# Uncomment to specify the preferred debugger connection transport:
|
||||||
|
#debug.transport=dt_socket
|
||||||
|
debug.classpath=\
|
||||||
|
${run.classpath}
|
||||||
|
debug.modulepath=\
|
||||||
|
${run.modulepath}
|
||||||
|
debug.test.classpath=\
|
||||||
|
${run.test.classpath}
|
||||||
|
debug.test.modulepath=\
|
||||||
|
${run.test.modulepath}
|
||||||
|
# Files in build.classes.dir which should be excluded from distribution jar
|
||||||
|
dist.archive.excludes=
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
dist.dir=dist
|
||||||
|
dist.jar=${dist.dir}/TareaCenaFilosofos.jar
|
||||||
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
|
dist.jlink.dir=${dist.dir}/jlink
|
||||||
|
dist.jlink.output=${dist.jlink.dir}/TareaCenaFilosofos
|
||||||
|
excludes=
|
||||||
|
includes=**
|
||||||
|
jar.compress=false
|
||||||
|
javac.classpath=
|
||||||
|
# Space-separated list of extra javac options
|
||||||
|
javac.compilerargs=
|
||||||
|
javac.deprecation=false
|
||||||
|
javac.external.vm=true
|
||||||
|
javac.modulepath=
|
||||||
|
javac.processormodulepath=
|
||||||
|
javac.processorpath=\
|
||||||
|
${javac.classpath}
|
||||||
|
javac.source=19
|
||||||
|
javac.target=19
|
||||||
|
javac.test.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
javac.test.modulepath=\
|
||||||
|
${javac.modulepath}
|
||||||
|
javac.test.processorpath=\
|
||||||
|
${javac.test.classpath}
|
||||||
|
javadoc.additionalparam=
|
||||||
|
javadoc.author=false
|
||||||
|
javadoc.encoding=${source.encoding}
|
||||||
|
javadoc.html5=false
|
||||||
|
javadoc.noindex=false
|
||||||
|
javadoc.nonavbar=false
|
||||||
|
javadoc.notree=false
|
||||||
|
javadoc.private=false
|
||||||
|
javadoc.splitindex=true
|
||||||
|
javadoc.use=true
|
||||||
|
javadoc.version=false
|
||||||
|
javadoc.windowtitle=
|
||||||
|
# The jlink additional root modules to resolve
|
||||||
|
jlink.additionalmodules=
|
||||||
|
# The jlink additional command line parameters
|
||||||
|
jlink.additionalparam=
|
||||||
|
jlink.launcher=true
|
||||||
|
jlink.launcher.name=TareaCenaFilosofos
|
||||||
|
main.class=tareacenafilosofos.TareaCenaFilosofos
|
||||||
|
manifest.file=manifest.mf
|
||||||
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
|
mkdist.disabled=false
|
||||||
|
platform.active=default_platform
|
||||||
|
run.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
# Space-separated list of JVM arguments used when running the project.
|
||||||
|
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
|
||||||
|
# To set system properties for unit tests define test-sys-prop.name=value:
|
||||||
|
run.jvmargs=
|
||||||
|
run.modulepath=\
|
||||||
|
${javac.modulepath}
|
||||||
|
run.test.classpath=\
|
||||||
|
${javac.test.classpath}:\
|
||||||
|
${build.test.classes.dir}
|
||||||
|
run.test.modulepath=\
|
||||||
|
${javac.test.modulepath}
|
||||||
|
source.encoding=UTF-8
|
||||||
|
src.dir=src
|
||||||
|
test.src.dir=test
|
15
Ejercicio_2/TareaCenaFilosofos/nbproject/project.xml
Normal file
15
Ejercicio_2/TareaCenaFilosofos/nbproject/project.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.java.j2seproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<name>TareaCenaFilosofos</name>
|
||||||
|
<source-roots>
|
||||||
|
<root id="src.dir"/>
|
||||||
|
</source-roots>
|
||||||
|
<test-roots>
|
||||||
|
<root id="test.src.dir"/>
|
||||||
|
</test-roots>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||||
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
|
||||||
|
*/
|
||||||
|
package tareacenafilosofos;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author kyman
|
||||||
|
*/
|
||||||
|
public class TareaCenaFilosofos {
|
||||||
|
|
||||||
|
// Configuración.
|
||||||
|
private static final int numero_de_filosofos = 5;
|
||||||
|
private static final int tiempo_minimo_de_espera = 10; // Milisegundos
|
||||||
|
private static final int tiempo_de_pensar = 10; // Segundos
|
||||||
|
private static final int tiempo_para_comer = 2; // Segundos
|
||||||
|
private static final int tiempo_limite_para_palillo = 100; // Milisegundos
|
||||||
|
// Configuración.
|
||||||
|
|
||||||
|
private static boolean trabajando = true;
|
||||||
|
private static Semaphore[] palillos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO code application logic here
|
||||||
|
|
||||||
|
palillos = new Semaphore[numero_de_filosofos];
|
||||||
|
|
||||||
|
new Thread(new Runnable(){
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
Scanner entrada = new Scanner(System.in);
|
||||||
|
String comando;
|
||||||
|
|
||||||
|
while(trabajando && (comando = entrada.nextLine()) != null){
|
||||||
|
switch(comando){
|
||||||
|
case "exit", "close", "cerrar", "terminar", "bye", "detener", "finalizar", "stop" -> trabajando = false;
|
||||||
|
default -> System.out.println("Comando '" + comando + "' desconocido.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
for(int i = 0; i < numero_de_filosofos; i ++)
|
||||||
|
palillos[i] = new Semaphore(1);
|
||||||
|
for(int i = 0; i < numero_de_filosofos; i ++)
|
||||||
|
crear_filosofo(i);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void excepcion(Exception exception){
|
||||||
|
System.out.println(exception.getMessage());
|
||||||
|
System.out.println(Arrays.toString(exception.getStackTrace()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long coger_milisegundos(){
|
||||||
|
return new Timestamp(System.currentTimeMillis()).getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean esperar(float segundos){
|
||||||
|
|
||||||
|
boolean continua = true;
|
||||||
|
float espera = (float) (Math.random() * segundos * 1000);
|
||||||
|
long inicio = coger_milisegundos();
|
||||||
|
|
||||||
|
try {
|
||||||
|
do{
|
||||||
|
if(trabajando)
|
||||||
|
Thread.sleep(tiempo_minimo_de_espera);
|
||||||
|
else{
|
||||||
|
continua = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}while(coger_milisegundos() - inicio < espera);
|
||||||
|
} catch (InterruptedException excepcion) {
|
||||||
|
TareaCenaFilosofos.excepcion(excepcion);
|
||||||
|
}
|
||||||
|
|
||||||
|
return continua && trabajando;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void crear_filosofo(int i){
|
||||||
|
|
||||||
|
Semaphore[] mis_palillos = {palillos[i], palillos[(i + 1) % numero_de_filosofos]};
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("empty-statement")
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
while(trabajando){
|
||||||
|
|
||||||
|
System.out.println("El filosofo '" + i + "' está pensando...");
|
||||||
|
if(!esperar(tiempo_de_pensar))break;
|
||||||
|
|
||||||
|
System.out.println("El filosofo '" + i + "' tiene hambre...");
|
||||||
|
while(
|
||||||
|
!mis_palillos[0].tryAcquire(tiempo_limite_para_palillo, TimeUnit.MILLISECONDS) ||
|
||||||
|
!mis_palillos[1].tryAcquire(tiempo_limite_para_palillo, TimeUnit.MILLISECONDS)
|
||||||
|
)
|
||||||
|
if(!trabajando)
|
||||||
|
return;
|
||||||
|
|
||||||
|
System.out.println("El filosofo '" + i + "' está comiendo...");
|
||||||
|
if(!esperar(tiempo_para_comer))break;
|
||||||
|
mis_palillos[0].release();
|
||||||
|
mis_palillos[1].release();
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (InterruptedException excepcion) {
|
||||||
|
TareaCenaFilosofos.excepcion(excepcion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
101
README.md
101
README.md
@ -1,3 +1,102 @@
|
|||||||
# PSP02_Tarea
|
# PSP02_Tarea
|
||||||
|
|
||||||
Ejercicios de producto-consumidor y la mesa de los filósofos con Semaphore.
|
Ejercicios de producto-consumidor y la mesa de los filósofos con Semaphore. Dichos ejercicios están subidos a la siguiente URL Git:
|
||||||
|
|
||||||
|
- https://git.k3y.pw/DAM2024/PSP02_Tarea
|
||||||
|
|
||||||
|
## producto-consumidor
|
||||||
|
|
||||||
|
Para este ejercicio se usó un simple String en vez de un vector o ArrayList de elementos para simplificar puesto que se hace uso de caracteres.
|
||||||
|
|
||||||
|
Tanto el productos como el consumidor, pese a ser dos hilos distintos, ambos no son más que objetos anónimos de tipo Thread volcados sobre un Overwrite del "run" de un Runnable. El proceso es muy rápido por lo que al ejecutar no habrá opción a nada hasta que acabe de trabajar. En este caso, ambos comparten una variable de tipo String como entorno de Buffer para compartir esa memoria de caracteres donde el productor genera nuevos caracteres al final de la cadena y el consumidor irá consumiendo desde el principio de la misma siguiendo las normas del ejericio las cuales entendí como:
|
||||||
|
|
||||||
|
- El productor no puede tener más de 6 caracteres en la cadena de memoria o Buffer compartido.
|
||||||
|
- El consumidor cogerá hasta 15 caracteres para generar un producto.
|
||||||
|
|
||||||
|
Al tener esas dos limitaciones, el programa se detendrá automáticamente cuando el consumidor consiga los 15 caracteres y el productor tenga 6 caracteres en el Buffer.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
|
||||||
|
B[Buffer]
|
||||||
|
P[Productor]
|
||||||
|
C[Consumidor]
|
||||||
|
A{Añade}
|
||||||
|
K{Coge}
|
||||||
|
|
||||||
|
P --> A
|
||||||
|
A -->|"Si Buffer < 6"| B
|
||||||
|
C --> K
|
||||||
|
K -->|"Si Buffer < 15 && \nConsumidor > 0"| B
|
||||||
|
```
|
||||||
|
|
||||||
|
La extracción de cada caracter se hace a partir de las letras inglesas mayúsculas de ASCII, es decir, a partir del caracter 65 hasta el 90, cogiendo un valor aleatorio entre 0 y 25.
|
||||||
|
|
||||||
|
La **configuración** es la siguiente:
|
||||||
|
|
||||||
|
- **longitud_limite_producto**: Determina la longitud máxima del producto.
|
||||||
|
- **longitud_maxima_buffer**: Determina la longitud máxima del Buffer.
|
||||||
|
|
||||||
|
## Problema de los Filósofos
|
||||||
|
|
||||||
|
Para este ejercicio, al no tener ningún objeto que cláramente requiera de datos específicos más que acciones comunes, se optó por hacer uso de objetos anónimos de tipo Thread contra objeto Runnable con el Override de su Run para establecer el proceso en cuestión.
|
||||||
|
|
||||||
|
En este ejercicio entiendo que una mesa redonda de filósofos tienen 3 acciones a desarrollar en bucle a lo largo del tiempo de forma ininterrumpida, las cuales son:
|
||||||
|
|
||||||
|
- **Pensar**: Acción que se simulará a partir de un Sleep con un tiempo aleatorio por cada ciclo.
|
||||||
|
- **Tener hambre**: Esta acción básicamente, a parte de ser un simple aviso al usuario confirme se cambia de estado a esperar a tener sus dos palillos disponibles, es el proceso de espera en la cual el filósofo espera su turno para poder hacer uso de sus palillos que dando simultáneamente, tanto el de su lado derecho como el de su lado izquierdo libres. Básicamente es un proceso de espera no controlado condicionado a tener sus palillos libres sin acaparar dichos palillos.
|
||||||
|
- **Comer**: Como la acción de pensar, en este caso sería una simulación a partir de un Sleep con un tiempo aleatorio por cada ciclo.
|
||||||
|
|
||||||
|
> Aquí planteo que ambos palillos queden libres pues si se hace uso de uno que le quede libre y espera al siguiente, este proceso puede bloquear la aplicación entendiendo la casuística de que por azar, cada filósofo coja un palillo y éstos estén en la espera de que el siguiente deje de hacer uso de los mismos, bloqueando infinitamente la aplicación, además de la falta de control para poder cerrar la aplicación de forma correcta.
|
||||||
|
|
||||||
|
Al ver que es un proceso infinito, para poder tener un control de detención de la aplicación se hará uso de la terminal donde si ponemos alguna de las claves "exit", "close", "cerrar", "terminar", "bye", "detener", "finalizar" o "stop", el programa detendrá todos los procesos y se finalizará independientemente del estado en el que se encuentre. Para poder llevar a cabo dicha acción, todo irá condicionado a una variable estática común llamada "trabajando" que determinará si está o no activa a modo de protocolo "Worker".
|
||||||
|
|
||||||
|
> En caso de poner cualquier otro comando no contempleado en esta guía, el terminal imprimirá su desconocimiento.
|
||||||
|
|
||||||
|
En este caso, los palillos serán los semáforos que regulan el consumo de procesos. Se entenderá que habrá un palillo por cada filósofo, y éstos los compartirán con sus vecinos inmediatos de mesa.
|
||||||
|
|
||||||
|
Un filósofo será un método para que éste almacene sus propios valores en su ejecución independiente de los demás (Encapsulación). Cada Filósofo constará de un par de punteros a sus palillos correspondientes para agilizar el acceso a éstos. Una vez dentro del hilo de procesos del propio filósofo, éste estará pensando un tiempo aleatorio, seguido de solicitar los palillos (Tener hambre y hacer uso de los semáforos) mediante el método **tryAcquire** de *Semaphore* por el hecho de que nos permite obtener si hemos conseguido retener ambos palillos en un tiempo simbólico que impida que retener uno de los dos palillos indefinidamente. Una vez con los dos palillos, se hará un tiempo de espera aleatorio conforme está comiendo y se liberarán ambos palillos. Tras esto se volverá a repetir el proceso infinitamente.
|
||||||
|
|
||||||
|
> Es cierto que los Filósofos pueden ser objetos, pero con objeto de simplificar en la medida de lo posible el/los Scripts de la tarea, y por la naturaleza y uso de los atributos que éstos llevarían, se obvió su creación como tal. Lo mismo puede ir aplicado a los palillos y al gestor de la terminal.
|
||||||
|
|
||||||
|
Se ha creado una instrucción de gestión de tiempo equivalente al *Thread.sleep* llamada *esperar* con motivo de que si se quiere detener el programa, éste gestione el *sleep* de forma intermitente, permitiendo el cierre de la aplicación inmediatamente.
|
||||||
|
|
||||||
|
> No se hizo uso de "wait" por el hecho de que éste habría de estar implementado en una clase-objeto, cosa que se deshechó anteriormente por la naturaleza de las acciones y valores a utilizar.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
|
||||||
|
P[Pensar]
|
||||||
|
H["Tener hambre"]
|
||||||
|
PI["Palillo izquierdo"]
|
||||||
|
PD["Palillo derecho"]
|
||||||
|
PA(["¿Ambos palillos libres?"])
|
||||||
|
C[Comer]
|
||||||
|
|
||||||
|
P --> H
|
||||||
|
H -..-|"Si mis palillos \nestán libres"| C
|
||||||
|
H -->|"¿Está libre?"| PI
|
||||||
|
H -->|"¿Está libre?"| PD
|
||||||
|
PI -->|Sí| PA
|
||||||
|
PD -->|Sí| PA
|
||||||
|
PI -->|No| PA
|
||||||
|
PD -->|No| PA
|
||||||
|
PA -->|Sí| C
|
||||||
|
PA -->|No| H
|
||||||
|
C -->|"Volver a empezar"| P
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
La **configuración** del ejercicio es la siguiente:
|
||||||
|
|
||||||
|
- **numero_de_filosofos**: Cantidad de filósofos que se procesarán. *Mínimo 2*.
|
||||||
|
- **tiempo_minimo_de_espera**: Tiempo mínimo de espera en milisegundos por los que se hará comprobación de que la aplicación sigue activa en el método "espera" equivalente a un "Thread.sleep".
|
||||||
|
- **tiempo_de_pensar**: Tiempo máximo en segundos dedicado a pensar. Éste valor es el que se usará para determinar un valor aleatorio de espera entre 0 y dicho número.
|
||||||
|
- **tiempo_para_comer**: Tiempo máximo en segundos dedicado para comer. Éste valor es el que se usará para determinar un valor aleatorio de espera entre 0 y dicho número.
|
||||||
|
- **tiempo_limite_para_palillo**: Tiempo límite en milisegundos en espera de que un palillo quede libre.
|
||||||
|
|
||||||
|
## F.A.Q.
|
||||||
|
|
||||||
|
> ¿Las aplicaciones pueden dar errores al alterar su configuración?
|
||||||
|
|
||||||
|
Las aplicaciones no tienen un control de errores profundo por la falta de tiempo por lo que pueden saltar errores cara una mala configuración o cara valores no esperados.
|
Loading…
Reference in New Issue
Block a user