May 11, 2023

Brute Force Techniques I

This is a description

Multiplication Tables

class MultiplicationTable extends Thread {
	private int number;

	public MultiplicationTable(int number) {
		this.number = number;
	}

	public void run() {
		System.out.println("Multiplication table for " + number + ":");
		for (int i = 1; i <= 10; i++) {
			System.out.println(number + " x " + i + " = " + (number * i));
		}
	}
}

public class Tables {
	public static void main(String[] args) {
		MultiplicationTable table5 = new MultiplicationTable(5);
		MultiplicationTable table7 = new MultiplicationTable(7);

		table5.start();

		try {
			table5.join(); // Wait for table5 to finish before starting table7
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		table7.start();
	}
}
PS F:\oopsies>
Multiplication table for 5:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
Multiplication table for 7:
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70

Matrix Sum Calculator

class RowSum implements Runnable {
	private int[] row;
	private int partialSum;

	public RowSum(int[] row) {
		this.row = row;
		this.partialSum = 0;
	}

	public int getPartialSum() {
		return partialSum;
	}

	public void run() {
		for (int value : row) {
			partialSum += value;
		}
	}
}

public class MatrixSum {
	public static void main(String[] args) {
		int[][] matrix = {
				{ 1, 2, 3 },
				{ 4, 5, 6 },
				{ 7, 8, 9 }
		};

		int numRows = matrix.length;
		int totalSum = 0;

		RowSum[] calculators = new RowSum[numRows];
		Thread[] threads = new Thread[numRows];

		for (int i = 0; i < numRows; i++) {
			calculators[i] = new RowSum(matrix[i]);
			threads[i] = new Thread(calculators[i]);
			threads[i].start();
		}

		try {
			for (int i = 0; i < numRows; i++) {
				threads[i].join();
				totalSum += calculators[i].getPartialSum();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("Total Sum: " + totalSum);
	}
}
PS F:\oopsies>
Total Sum: 45

Producer-Consumer Problem

import java.util.ArrayList;

class Buffer {
	private ArrayList<Integer> list = new ArrayList<>();
	private int capacity;

	public Buffer(int capacity) {
		this.capacity = capacity;
	}

	public synchronized void produce(int item) {
		while (list.size() == capacity) {
			try {
				wait(); // Wait if the buffer is full
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		list.add(item);
		System.out.println("Produced: " + item);

		notify(); // Notify waiting consumer
	}

	public synchronized int consume() {
		while (list.isEmpty()) {
			try {
				wait(); // Wait if the buffer is empty
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		int item = list.remove(0);
		System.out.println("Consumed: " + item);

		notify(); // Notify waiting producer

		return item;
	}
}

class Producer implements Runnable {
	private Buffer buffer;

	public Producer(Buffer buffer) {
		this.buffer = buffer;
	}

	@Override
	public void run() {
		for (int i = 1; i <= 5; i++) {
			buffer.produce(i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable {
	private Buffer buffer;

	public Consumer(Buffer buffer) {
		this.buffer = buffer;
	}

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			buffer.consume();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class ProducerConsumer {
	public static void main(String[] args) {
		Buffer buffer = new Buffer(5);

		Thread producerThread = new Thread(new Producer(buffer));
		Thread consumerThread = new Thread(new Consumer(buffer));

		producerThread.start();
		consumerThread.start();
	}
}
PS F:\oopsies>
Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5