By GokiSoft.com|
19:17 10/06/2024|
Java Advanced
[Shared Code] Bài toán đa luồng (MultiThreading in java) đọc File trong Java - C2307L
Bài toán đa luồng (MultiThreading in java) đọc File trong Java
#Main.java
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.gokisoft.lesson04;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author teacher
*/
public class Main {
public static void main(String[] args) {
//createDataFile();
SharedData sharedData = new SharedData();
Thread1 t1 = new Thread1(sharedData);
Thread2 t2 = new Thread2(sharedData);
Thread3 t3 = new Thread3(sharedData);
t1.start();
t2.start();
t3.start();
}
/**
* Cau 1
*/
static void createDataFile() {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
Random random = new Random();
int n;
try {
fileWriter = new FileWriter("number.txt");
bufferedWriter = new BufferedWriter(fileWriter);
n = random.nextInt(10, 100);
bufferedWriter.write(n+"\n");
for (int i = 0; i < n; i++) {
int num = random.nextInt(1, 500);
bufferedWriter.write(num+"\n");
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if(bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
if(fileWriter != null) {
try {
fileWriter.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
//Ends
}
}
#SharedData.java
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.gokisoft.lesson04;
/**
*
* @author teacher
*/
public class SharedData {
public static final int THREAD_1 = 1;
public static final int THREAD_2 = 2;
public static final int THREAD_3 = 3;
int num;
boolean live;
int currentThread;
public SharedData() {
num = 0;
live = true;
currentThread = THREAD_1;
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getCurrentThread() {
return currentThread;
}
public void setCurrentThread(int currentThread) {
this.currentThread = currentThread;
}
}
#Thread1.java
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.gokisoft.lesson04;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author teacher
*/
public class Thread1 extends Thread {
SharedData sharedData;
public Thread1(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
synchronized (sharedData) {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader("number.txt");
bufferedReader = new BufferedReader(fileReader);
//Remove first line
bufferedReader.readLine();
String line;
while ((line = bufferedReader.readLine()) != null) {
if (!line.isEmpty()) {
//Du lieu chuan
int num = Integer.parseInt(line.trim());
System.out.println(num);
sharedData.setNum(num);
if (num % 2 == 0) {
//Chuyen sang Thread 2
sharedData.setCurrentThread(SharedData.THREAD_2);
} else {
//Chuyen sang Thread 3
sharedData.setCurrentThread(SharedData.THREAD_3);
}
sharedData.notifyAll();
try {
while(sharedData.isLive() && sharedData.getCurrentThread() != SharedData.THREAD_1) {
sharedData.wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
}
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException ex) {
Logger.getLogger(Thread1.class.getName()).log(Level.SEVERE, null, ex);
}
}
//Thong bao toi Thread khac -> STOP
sharedData.setLive(false);
sharedData.notifyAll();
}
}
//Ends
System.out.println("T1 stop");
}
}
#Thread2.java
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.gokisoft.lesson04;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author teacher
*/
public class Thread2 extends Thread {
SharedData sharedData;
public Thread2(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
synchronized (sharedData) {
while (sharedData.isLive()) {
sharedData.notifyAll();
try {
while (sharedData.isLive() && sharedData.getCurrentThread() != SharedData.THREAD_2) {
sharedData.wait();
}
if(!sharedData.isLive()) {
break;
}
} catch (InterruptedException ex) {
Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
}
int num = sharedData.getNum();
System.out.print("\nT2: ");
for (int i = 1; i <= num; i++) {
if (num % i == 0) {
System.out.print(i + ",");
}
}
System.out.println("");
//Chuyen sang Thread 1
sharedData.setCurrentThread(SharedData.THREAD_1);
}
sharedData.notifyAll();
}
System.out.println("T2 stop");
}
}
#Thread3.java
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.gokisoft.lesson04;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author teacher
*/
public class Thread3 extends Thread {
SharedData sharedData;
public Thread3(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
synchronized (sharedData) {
while (sharedData.isLive()) {
sharedData.notifyAll();
try {
while (sharedData.isLive() && sharedData.getCurrentThread() != SharedData.THREAD_3) {
sharedData.wait();
}
if(!sharedData.isLive()) {
break;
}
} catch (InterruptedException ex) {
Logger.getLogger(Thread3.class.getName()).log(Level.SEVERE, null, ex);
}
int num = sharedData.getNum();
System.out.println("T3: " + num * num);
//Chuyen Thread1 chay
sharedData.setCurrentThread(SharedData.THREAD_1);
}
sharedData.notifyAll();
}
System.out.println("T3 stop");
}
}
Tags: