0

我有一个 Java 代码,它调用一个类的两个方法。像下面这样,

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());
  }
  }
}

在第一种方法中,代码将创建一个共享数组,在第二种方法中,它将与文件进行比较。

现在,我想ReadData()使用多个线程以并行方式运行这两种方法。任何人都可以帮我做到这一点。可能有一些代码修改。

4

3 回答 3

2
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());
    }
}

}
于 2012-07-29T18:25:56.940 回答
0

使类实现“可运行”,创建 2 个实例并运行它们。

于 2012-07-29T18:14:49.907 回答
0

只要您ReadData在不同线程中调用期间不修改您的数组,您就可以让它不同步。
更好和更强大的方法是同步对阵列的访问。

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();
        }
    }
}
于 2012-07-29T18:18:04.483 回答