I have a Java code which is calling two methods of a class. Like following,
import java.io.*;
class Example
{
public static void main(String args[])
{
try{
FileOutputStream fos = new FileOutputStream("1.dat");
DataOutputStream dos = new DataOutputStream(fos);
for(int i =0 ; i < 100 ; i++){
dos.writeInt(i);
}
dos.close();
FileOutputStream fos1 = new FileOutputStream("2.dat");
DataOutputStream dos1 = new DataOutputStream(fos1);
for(int i =100 ; i < 200 ; i++){
dos1.writeInt(i);
}
dos1.close();
Exampless ex = new Exampless();
ex.createArray(0);
ex.ReadData("1.dat");
ex.ReadData("2.dat");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
class Exampless{
public static int []arr = new int [100] ;
void createArray(int z){
for(int i =z ; i < z+100 ; i++)
arr[i-z] = i ;
}
public synchronized void ReadData(String name){
try{
int cnt = 0;
FileInputStream fin = new FileInputStream(name);
DataInputStream din = new DataInputStream(fin);
for(int i = 0 ; i < 100 ; i++){
int c = din.readInt();
if(c == arr[i])
cnt++ ;
}
System.out.println("File name: " + name + " No. of Matches: " + cnt) ;
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
In the first method, the code will create a shared array and in the second method it will compare it with a file.
Now, I want to run those two ReadData()
methods in a parallel manner, using multiple threads. Can anybody help me do that. Possibly with some code modification.
import java.io.*;
public class Example{
public static void main(String args[]) {
try {
FileOutputStream fos = new FileOutputStream("1.dat");
DataOutputStream dos = new DataOutputStream(fos);
for (int i = 0; i < 100; i++) {
dos.writeInt(i);
}
dos.close();
FileOutputStream fos1 = new FileOutputStream("2.dat");
DataOutputStream dos1 = new DataOutputStream(fos1);
for (int i = 100; i < 200; i++) {
dos1.writeInt(i);
}
dos1.close();
Exampless.createArray(0); //static method call to set the static arr variable
Exampless ex1 = new Exampless("1.dat");
Exampless ex2 = new Exampless("2.dat");
Thread t1 = new Thread(ex1);
Thread t2 = new Thread(ex2);
t1.start(); //calls the run method in ex1 in a new thread
t2.start();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
class Exampless implements Runnable {
public static int[] arr = new int[100];
public String _name;
public Exampless(String name) {
this._name = name;
}
static void createArray(int z) {
for (int i = z; i < z + 100; i++) {
arr[i - z] = i;
}
}
@Override
public void run() {
try {
int cnt = 0;
FileInputStream fin = new FileInputStream(_name);
DataInputStream din = new DataInputStream(fin);
for (int i = 0; i < 100; i++) {
int c = din.readInt();
if (c == arr[i]) {
cnt++;
}
}
System.out.println("File name: " + _name + " No. of Matches: " + cnt);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
使类实现“runnable”,创建2个实例并运行它们。
As long as you don't modify your array during calling ReadData
in a different thread you could leave it without synchronization.
A better and more robust way would be to synchronize the access to your array.
import java.io.*;
class Exampless {
private static int[] arr = new int[100];
private static ReadWriteLock lock = new ReentrantReadWriteLock();
void createArray(int z) {
lock.writeLock().lock();
try {
for (int i = z; i < z + 100; i++)
arr[i - z] = i;
} finally {
lock.writeLock().unlock();
}
}
void ReadData(String name) {
lock.readLock().lock();
try {
int cnt = 0;
FileInputStream fin = new FileInputStream(name);
DataInputStream din = new DataInputStream(fin);
for (int i = 0; i < 100; i++) {
int c = din.readInt();
if (c == arr[i])
cnt++;
}
System.out
.println("File name: " + name + " No. of Matches: " + cnt);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
} finally {
lock.readLock().unlock();
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.