Thread.setPriority()不能正常工作?

时间:2014-04-23 20:03:19

标签: java multithreading class java-ee

我正在玩线程。我在多线程程序中读取两个文本文件a.txt和b.txt。 我正在做的是我为a.txt中的线程读取数据分配更高的优先级。 但这并没有生效。 首先读取a.txt文件或发生异常。 加上一个例外也在发生。 任何人都可以帮助我。

void main()

package introtothreading;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.Thread;
import java.util.logging.Level;
import java.util.logging.Logger;

public class IntroToThreading {
public static void main(String[] args) { 
FileReaderA fa = new FileReaderA();
FileReaderB fb = new FileReaderB();
Thread t4 =  new Thread(fa);
Thread t5 =  new Thread(fb);
t4.setPriority(Thread.MAX_PRIORITY);
t5.setPriority(Thread.MIN_PRIORITY);
t5.start();
t4.start();
}   
}

FileReaderA

 public class FileReaderA  implements Runnable
 {
File f = new File("D:/a.txt") ;
FileReader fr ;
BufferedReader br ;
public FileReaderA()
{
    try {
        fr = new FileReader(f);  
        br  =  new BufferedReader(fr);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileReaderA.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void run() {
    try {       
        String s;
        s = br.readLine();
        do
        {
        System.out.println(s);
        s = br.readLine();
        }
        while(! s.equals(""));
        //To change body of generated methods, choose Tools | Templates.
    } catch (IOException ex) {
        System.out.println("IO Exception..");
    }
   }    
   }

FileReaderB

 public class FileReaderB implements Runnable
 {


 File f = new File("D:/b.txt") ;
 FileReader fr ;
 BufferedReader br ;
 public FileReaderB()
 {
    try {
        fr = new FileReader(f);  
        br  =  new BufferedReader(fr);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileReaderB.class.getName()).log(Level.SEVERE, null, ex);
    }
 }

 @Override
 public void run() {
    try {       
        String s1;
        s1 = br.readLine();
        do
        {
        System.out.println(s1);
        s1 = br.readLine();
        }
        while(!s1.equals(" "));
        //To change body of generated methods, choose Tools | Templates.
     } catch (IOException ex) {
        System.out.println("IO Exception..");
    }
 }    
 }

输出

 run:
 1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 Exception in thread "Thread-4" java.lang.NullPointerException
at introtothreading.FileReaderB.run(FileReaderB.java:39)
at java.lang.Thread.run(Thread.java:744)
2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
1-bbbbbbbbbbbbbbbbbbbbbbbb
2-bbbbbbbbbbbbbbbbbbbbbbbb
3-bbbbbbbbbbbbbbbbbbbbbb
4-bbbbbbbbbbbbbb
5-bbbbbbbbbbbbbbbbbbbbbbbbbbbb
6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
6-bbb
7-bbbbbbbbbbbbbb
8-bbbbb
9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
BUILD SUCCESSFUL (total time: 10 seconds)


**output2**


 1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 1-bbbbbbbbbbbbbbbbbbbbbbbb
 2-bbbbbbbbbbbbbbbbbbbbbbbb
 3-bbbbbbbbbbbbbbbbbbbbbb
 4-bbbbbbbbbbbbbb
 5-bbbbbbbbbbbbbbbbbbbbbbbbbbbb
 6-bbb
 7-bbbbbbbbbbbbbb
 8-bbbbb
 9-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
 2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 4-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 6-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 7-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 8-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 Exception in thread "Thread-4" java.lang.NullPointerException
at introtothreading.FileReaderB.run(FileReaderB.java:39)
at java.lang.Thread.run(Thread.java:744)

和我的

a.txt文件包含

1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

2-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

3-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

4- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

5-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

-6- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

7- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

8 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

b.txt文件包含

1-bbbbbbbbbbbbbbbbbbbbbbbb

2-bbbbbbbbbbbbbbbbbbbbbbbb

3-bbbbbbbbbbbbbbbbbbbbbb

4- bbbbbbbbbbbbbb

5-bbbbbbbbbbbbbbbbbbbbbbbbbbbb

6-BBB

7- bbbbbbbbbbbbbb

8-BBBBB

9 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

2 个答案:

答案 0 :(得分:0)

由于文件非常小,很可能在线程之间甚至有上下文切换之前读取它们。我建议使用更大的文件来看到明显的效果。尝试复制文件的内容,直到你有大约100Kb的数据,你应该看到很大的不同。

您收到NullPointerException因为readLine在文件末尾返回null,请参阅readline() returns null in Java

答案 1 :(得分:0)

首先,在java线程中设置优先级并不是在另一个之前执行一件事的可靠方法。相反,只要在你想要连续发生的事件之间建立一个具体的事件之前就更明智了。

这里的问题是由于你在t4上调用它之前在t5开始调用的第二个事实。虽然t4的优先级更高t5在t4之前是启动器,并且由于您的计算机有多个处理器,因此在读取A文件之前几乎肯定会完成读取文件。

您的异常是由于您连续读取run方法中的行并比较它们而不先检查它们是否为空。使用while循环而不是do while。

将来使用线程池和队列,并使用调试器找出抛出异常的原因。