简体   繁体   中英

Java Thread Code Issue

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM