Add DancingText, TrafficLight, MyBuffer and SearchEngine classes
This commit is contained in:
parent
d0a8edecfe
commit
036024365f
5 changed files with 433 additions and 0 deletions
91
src/de/dhbwka/java/exercise/threads/DancingText.java
Normal file
91
src/de/dhbwka/java/exercise/threads/DancingText.java
Normal file
|
@ -0,0 +1,91 @@
|
|||
package de.dhbwka.java.exercise.threads;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
/**
|
||||
* Part of lectures on 'Programming in Java'. Baden-Wuerttemberg
|
||||
* Cooperative State University.
|
||||
*
|
||||
* (C) 2016-2018 by W. Geiger, T. Schlachter, C. Schmitt, W. Suess
|
||||
*
|
||||
* @author DHBW lecturer
|
||||
* @version 1.1-NO-DANCE
|
||||
*/
|
||||
@SuppressWarnings( "serial" )
|
||||
public class DancingText extends JComponent {
|
||||
|
||||
private final static int XBASE = 30;
|
||||
private final static int XSTEP = 36;
|
||||
private final static int YBASE = 150;
|
||||
private final static Random RANDOM = new Random();
|
||||
|
||||
private String text;
|
||||
private final long delay;
|
||||
|
||||
private int colR = 0; // Color-Channel: red
|
||||
private int colG = 90; // Color-Channel: green
|
||||
private int colB = 180; // Color-Channel: blue
|
||||
private int yOffset = 0;
|
||||
|
||||
public DancingText( String text, long delay ) {
|
||||
this.text = text;
|
||||
this.delay = delay;
|
||||
|
||||
Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
while ( true ) {
|
||||
DancingText.this.repaint();
|
||||
try {
|
||||
Thread.sleep( DancingText.this.delay );
|
||||
} catch ( InterruptedException e ) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
t.setDaemon( true );
|
||||
t.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Paint dancing text on Graphics
|
||||
*
|
||||
* @param g
|
||||
* graphics to use
|
||||
*/
|
||||
@Override
|
||||
public void paintComponent( Graphics g ) {
|
||||
super.paintComponent( g );
|
||||
g.setFont( new Font( "Helvetica", Font.BOLD, 48 ) );
|
||||
for ( int i = 0; i < this.text.length(); i++ ) {
|
||||
char c = this.text.charAt( i );
|
||||
|
||||
this.colR = (this.colR + 4 + DancingText.RANDOM.nextInt( 4 )) % 256;
|
||||
this.colG = (this.colG + 4 + DancingText.RANDOM.nextInt( 4 )) % 256;
|
||||
this.colB = (this.colB + 4 + DancingText.RANDOM.nextInt( 4 )) % 256;
|
||||
|
||||
this.yOffset = DancingText.RANDOM.nextInt( 30 );
|
||||
|
||||
g.setColor( new Color( this.colR, this.colG, this.colB ) );
|
||||
g.drawString( "" + c, DancingText.XBASE + i * DancingText.XSTEP,
|
||||
DancingText.YBASE - this.yOffset );
|
||||
}
|
||||
}
|
||||
|
||||
public static void main( String[] args ) {
|
||||
// Create frame and add DancingText component
|
||||
JFrame f = new JFrame( "Dancing Text" );
|
||||
f.add( new DancingText( "Dancing Text :-)", 200 ) );
|
||||
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
|
||||
f.setSize( 640, 280 );
|
||||
f.setVisible( true );
|
||||
}
|
||||
}
|
146
src/de/dhbwka/java/exercise/threads/TrafficLight.java
Normal file
146
src/de/dhbwka/java/exercise/threads/TrafficLight.java
Normal file
|
@ -0,0 +1,146 @@
|
|||
package de.dhbwka.java.exercise.threads;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
class LightPhase {
|
||||
private String name;
|
||||
private boolean red;
|
||||
private boolean yellow;
|
||||
private boolean green;
|
||||
private int duration;
|
||||
private int next;
|
||||
|
||||
public LightPhase(String name, boolean red, boolean yellow, boolean green, int duration, int next) {
|
||||
this.name = name;
|
||||
this.red = red;
|
||||
this.yellow = yellow;
|
||||
this.green = green;
|
||||
this.duration = duration;
|
||||
this.next = next;
|
||||
}
|
||||
|
||||
public LightPhase getNext() {
|
||||
return LightPhases[next];
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public boolean isRed() {
|
||||
return red;
|
||||
}
|
||||
|
||||
public boolean isYellow() {
|
||||
return yellow;
|
||||
}
|
||||
|
||||
public boolean isGreen() {
|
||||
return green;
|
||||
}
|
||||
|
||||
public int getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
private final static LightPhase LightPhases[] = {
|
||||
new LightPhase("Red", true, false, false, 500, 1),
|
||||
new LightPhase("Red+Yellow", true, true, false, 200, 2),
|
||||
new LightPhase("Green", false, false, true, 500, 3),
|
||||
new LightPhase("Yellow", false, true, false, 200, 0)
|
||||
};
|
||||
|
||||
public static LightPhase[] getLightPhases() {
|
||||
return LightPhases;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Part of lectures on 'Programming in Java'. Baden-Wuerttemberg
|
||||
* Cooperative State University.
|
||||
*
|
||||
* (C) 2016-2018 by W. Geiger, T. Schlachter, C. Schmitt, W. Suess
|
||||
*
|
||||
* @author DHBW lecturer
|
||||
* @version 1.1-STATICLIGHT
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class TrafficLight extends JComponent {
|
||||
private final static long DELAY = 500;
|
||||
|
||||
LightPhase currentPhase = LightPhase.getLightPhases()[0];
|
||||
|
||||
public TrafficLight() {
|
||||
Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
repaint();
|
||||
try {
|
||||
Thread.sleep(currentPhase.getDuration());
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
currentPhase = currentPhase.getNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
t.setDaemon(true);
|
||||
t.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
|
||||
// traffic light box
|
||||
g.setColor(Color.BLACK);
|
||||
g.fillRect(10, 10, 80, 195);
|
||||
|
||||
// 3 x empty light
|
||||
g.setColor(Color.WHITE);
|
||||
g.fillOval(23, 23, 54, 54);
|
||||
g.fillOval(23, 83, 54, 54);
|
||||
g.fillOval(23, 143, 54, 54);
|
||||
|
||||
/*
|
||||
* ====================================================
|
||||
* ====================================================
|
||||
* SET THE CORRECT VALUES FOR THE FOLLOWING 3 VARIABLES
|
||||
* ====================================================
|
||||
* ====================================================
|
||||
*/
|
||||
boolean redOn = currentPhase.isRed();
|
||||
boolean yellowOn = currentPhase.isYellow();
|
||||
boolean greenOn = currentPhase.isGreen();
|
||||
|
||||
// draw colored lights, if active
|
||||
if (redOn) {
|
||||
g.setColor(Color.RED);
|
||||
g.fillOval(25, 25, 50, 50);
|
||||
}
|
||||
|
||||
if (yellowOn) {
|
||||
g.setColor(Color.YELLOW);
|
||||
g.fillOval(25, 85, 50, 50);
|
||||
}
|
||||
if (greenOn) {
|
||||
g.setColor(Color.GREEN);
|
||||
g.fillOval(25, 145, 50, 50);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Create frame and add TrafficLight component
|
||||
JFrame f = new JFrame("Traffic Light");
|
||||
f.add(new TrafficLight());
|
||||
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
f.setSize(100, 260);
|
||||
f.setVisible(true);
|
||||
}
|
||||
|
||||
}
|
97
src/de/dhbwka/java/exercise/threads/buffer/MyBuffer.java
Normal file
97
src/de/dhbwka/java/exercise/threads/buffer/MyBuffer.java
Normal file
|
@ -0,0 +1,97 @@
|
|||
package de.dhbwka.java.exercise.threads.buffer;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
public class MyBuffer {
|
||||
LinkedList<Integer> buffer;
|
||||
static final int MAX_SIZE = 10;
|
||||
|
||||
public MyBuffer() {
|
||||
buffer = new LinkedList<>();
|
||||
}
|
||||
|
||||
public synchronized void put(int value) throws InterruptedException {
|
||||
while (buffer.size() >= MAX_SIZE) {
|
||||
wait(); // Wait until space is available
|
||||
}
|
||||
buffer.add(value);
|
||||
System.out.println("Produced: " + value);
|
||||
notifyAll(); // Notify consumers that an item has been added
|
||||
}
|
||||
|
||||
public synchronized int get() throws InterruptedException {
|
||||
while (buffer.isEmpty()) {
|
||||
wait(); // Wait until an item is available
|
||||
}
|
||||
int value = buffer.removeFirst();
|
||||
System.out.println("Consumed: " + value);
|
||||
notifyAll(); // Notify producers that space is available
|
||||
return value;
|
||||
}
|
||||
|
||||
public synchronized int size() {
|
||||
return buffer.size();
|
||||
}
|
||||
}
|
||||
|
||||
class Producer extends Thread {
|
||||
private MyBuffer buffer;
|
||||
|
||||
public Producer(MyBuffer buffer) {
|
||||
this.buffer = buffer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
buffer.put(i);
|
||||
Thread.sleep((long) (Math.random() * 1000));
|
||||
System.out.println("Produced: " + i);
|
||||
System.out.println("Buffer size: " + buffer.size());
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Consumer extends Thread {
|
||||
private MyBuffer buffer;
|
||||
|
||||
public Consumer(MyBuffer buffer) {
|
||||
this.buffer = buffer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
int value = buffer.get();
|
||||
Thread.sleep((long) (Math.random() * 1000));
|
||||
System.out.println("Processed: " + value);
|
||||
System.out.println("Buffer size: " + buffer.size());
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Runner {
|
||||
public static void main(String[] args) {
|
||||
MyBuffer buffer = new MyBuffer();
|
||||
Producer producer = new Producer(buffer);
|
||||
Consumer consumer = new Consumer(buffer);
|
||||
|
||||
producer.start();
|
||||
consumer.start();
|
||||
|
||||
try {
|
||||
producer.join();
|
||||
consumer.join();
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
95
src/de/dhbwka/java/exercise/threads/search/SearchEngine.java
Normal file
95
src/de/dhbwka/java/exercise/threads/search/SearchEngine.java
Normal file
|
@ -0,0 +1,95 @@
|
|||
package de.dhbwka.java.exercise.threads.search;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class SearchEngine {
|
||||
private static final int MAX_THREADS = 3;
|
||||
private List<PageLoader> running_loaders = new ArrayList<>();
|
||||
private static final String file = "src/de/dhbwka/java/exercise/threads/search/uri.txt";
|
||||
|
||||
public SearchEngine() throws InterruptedException {
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
|
||||
Iterator<String> lines = br.lines().iterator();
|
||||
while (running_loaders.size() > 0 || lines.hasNext()) {
|
||||
if (running_loaders.size() < MAX_THREADS && lines.hasNext()) {
|
||||
String line = lines.next();
|
||||
PageLoader pl = new PageLoader(line, "UTF-8");
|
||||
Thread plThread = new Thread(pl);
|
||||
System.out.println("Loading " + line);
|
||||
plThread.start();
|
||||
running_loaders.add(pl);
|
||||
}
|
||||
|
||||
List<PageLoader> toRemove = new ArrayList<>();
|
||||
for (PageLoader pl : this.running_loaders) {
|
||||
if (pl != null && pl.pageLoaded()) {
|
||||
System.out.println(
|
||||
"Page " + pl.getUrl() + " loaded: " + pl.getPageContent().replaceAll("\n", "##").substring(0, 40));
|
||||
toRemove.add(pl);
|
||||
}
|
||||
}
|
||||
running_loaders.removeAll(toRemove);
|
||||
|
||||
Thread.sleep(100);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
new SearchEngine();
|
||||
}
|
||||
}
|
||||
|
||||
class PageLoader implements Runnable {
|
||||
private String content;
|
||||
|
||||
public synchronized boolean pageLoaded() {
|
||||
return content != null;
|
||||
}
|
||||
|
||||
public synchronized String getPageContent() {
|
||||
if (!pageLoaded())
|
||||
throw new Error("Page not loaded");
|
||||
return content;
|
||||
}
|
||||
|
||||
public static String getStringContentFromUrl(String url, String encoding) {
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
String line = null;
|
||||
try (BufferedReader br = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
new URI(url).toURL().openStream(), encoding))) {
|
||||
while ((line = br.readLine()) != null) {
|
||||
buffer.append(line).append(System.lineSeparator());
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
private String url;
|
||||
private String encoding;
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public PageLoader(String url, String encoding) {
|
||||
this.url = url;
|
||||
this.encoding = encoding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
this.content = getStringContentFromUrl(url, encoding);
|
||||
}
|
||||
}
|
4
src/de/dhbwka/java/exercise/threads/search/uri.txt
Normal file
4
src/de/dhbwka/java/exercise/threads/search/uri.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
https://www.tagesschau.de
|
||||
https://www.sueddeutsche.de
|
||||
https://www.spiegel.de
|
||||
https://www.kit.edu
|
Loading…
Add table
Add a link
Reference in a new issue