Thread.setPriority() 工作不正常?

Thread.setPriority() is not working fine?

提问人:hina abbasi 提问时间:4/24/2014 更新时间:4/24/2014 访问量:679

问:

我只是在玩线程。我正在多线程程序中读取两个文本文件 A.txt 和 B.txt。 我正在做的是,我为从 A.txt 读取数据的线程分配了更高的优先级。 但这并没有产生影响。 首先读取 .txt 文件或出现异常情况。 此外,还发生了异常。 这里有人请帮帮我。

无效 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..");
    }
   }    
   }

文件阅读器B

 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-啊啊

2-啊啊

3-啊

4-啊

5-啊

6-啊啊

7-啊啊

8-啊啊

b.txt 文件包含

1-bbbbbbbb

2-bbbbbbbb

3-bbbbbbbbbb

4-bbbbbbbbbb

5-bbbbbbbb

6-桶

7-bbbbbbbbbb

8-BBBB桶

9-bbbbbb

Java 多线程 jakarta-ee

评论

1赞 Natan Cox 4/24/2014
这种多线程方式在 Java 中被弃用了很长一段时间。请立即使用线程池和优先级队列。

答:

0赞 numX 4/24/2014 #1

很有可能,由于文件非常小,因此在线程之间进行上下文切换之前,它们就会被读取。我建议使用更大的文件来查看明显的效果。尝试复制文件的内容,直到您拥有大约 100Kb 的数据,您应该会看到相当大的差异。

你得到一个 因为在文件末尾返回 null,请参阅 readline() 在 Java 中返回 nullNullPointerExceptionreadLine

0赞 Milo Hou 4/24/2014 #2

首先,在 java 线程中设置优先级并不是先执行一件事的万无一失的方法。相反,更明智的做法是在您希望连续发生的事件之间建立具体的先发生关系。

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

异常是由于在运行方法中连续读取行并比较它们而未首先检查它们是否为 null 而导致的。使用 while 循环而不是 do while。

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