2012-07-29 136 views
0

我有一个调用两个类的方法的Java代码。像以下,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()方法,使用多个线程。任何人都可以帮助我做到这一点。可能与一些代码修改。

+2

你们是不是并行运行一次在两个独立的数据集的工作(以更好地利用多核处理器,例如),或者是你想获得两个线程在一组数据上工作(这更麻烦)? – Bobulous 2012-07-29 18:11:19

+0

哪两个?你的意思是'createArray'和'ReadData'?还是你想用不同的参数多次调用'ReadData'?在后一种情况下,我会建议同步对数组“arr”的访问。例如。使用[ReadWriteLock](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReadWriteLock.html)。 – 2012-07-29 18:11:54

+0

@ user1515834,我想用它来更好地使用多核处理器。正如你所看到的,不需要同步。 – Arpssss 2012-07-29 18:12:53

回答

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

} 
0

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

+0

但是,如果我让类实现“runnable”,那么它将同时运行这两种方法。我只想要一个并行运行。 – Arpssss 2012-07-29 18:26:34

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

这是并行运行吗? – Arpssss 2012-07-29 18:21:29

+0

您仍然需要创建[Thread](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html),但您可以安全地多次调用ReadData方法通过不同的线程。没有同步化,它会来[Race Condition](http://de.wikipedia.org/wiki/Race_Condition)s。 – 2012-07-29 18:38:28