当我尝试在扩展了Thread
的类中使用方法时,运行后它不会接收这些方法。
我的课:
public class PassPhraseValidator<E> extends Thread {
private List<E> list;
private boolean isValid;
private String passPhrase;
public PassPhraseValidator(List<E> list) {
this.list = list;
}
public String getPassPhrase() {
return passPhrase;
}
public boolean isValid() {
return isValid;
}
public void run(){
this.passPhrase = Arrays.toString(list.toArray());
this.isValid = list.stream().filter(e -> Collections.frequency(list, e) > 1).count() == 0;
}
}
所以当我像这样执行此类时:
PassPhraseValidator<Integer> validIntegerPassPhrase = new PassPhraseValidator<>(Arrays.asList(12, 18, 15, 32));
validIntegerPassPhrase.start();
System.out.println(validIntegerPassPhrase.getPassPhrase() + " valid: " + validIntegerPassPhrase.isValid());
它给了我一个错误,但它应该是真实的,因为还没有运行run函数。
我在这里做错了什么?如何使多线程成为其中的一部分?当我直接将其放入方法中时,它确实起作用。
答案 0 :(得分:1)
最后一个System.out.println
语句不等待线程(run
函数)完成。
等待其完成的一种方法是调用join
方法
validIntegerPassPhrase.join(); //Need to handle the InterruptedException it might throw
System.out.println(validIntegerPassPhrase.getPassPhrase() + " valid: " + validIntegerPassPhrase.isValid());
答案 1 :(得分:1)
说明
您正在做的事情称为多线程。这允许多个线程执行代码concurrency或并行执行代码。程序在称为main thread的程序上运行。这意味着一个线程正在系统地执行所有代码。一个指令接一个指令。当像您一样引入另一个线程时,程序执行是在同一时间上以不同的逻辑完成的。因此,当您在实现start()
类时执行thread
方法时,会导致它在后台执行相应的run()
方法,直到;完成后,将引发异常,应用程序关闭或线程停止。
让我们逐步执行代码并分析场景。
线程对象由main thread
实例化。让我们将此新线程称为thread2
。
thread2
由main thread
开始。
thread2
和main thread
并行运行。这意味着代码(为了简单起见)在同一时间被它们两个执行。
此问题可能发生两种可能性; Java Memory Barrier(超出此问题的范围,但更多参考文献here)或时间安排。 main thread
最有可能在thread2
完成各自的run()
方法之前阅读打印语句。
解决方案
一种方法可能是根本不使用多线程。线程的创建是一项非常昂贵的操作,不应经常执行。通常,在需要多线程thread-pools的应用程序中使用。
使用join()
阻止功能。 Join强制调用线程(在这种情况下为main thread
)等待,以使相应线程在继续执行之前完成执行。
使用Promise
来实现线程。该对象是Future
类的包装,允许get()
方法被阻塞。这意味着要 wait 的调用线程(在本例中为main thread
),等待相应的线程在继续执行之前完成执行。可以在here中找到Promise
的示例。