在线程内使用方法

时间:2018-08-16 17:08:43

标签: java multithreading

当我尝试在扩展了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函数。

我在这里做错了什么?如何使多线程成为其中的一部分?当我直接将其放入方法中时,它确实起作用。

2 个答案:

答案 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()方法,直到;完成后,将引发异常,应用程序关闭或线程停止。

让我们逐步执行代码并分析场景。

  1. 线程对象由main thread实例化。让我们将此新线程称为thread2

  2. thread2main thread开始。

  3. thread2main thread并行运行。这意味着代码(为了简单起见)在同一时间被它们两个执行。

  4. 此问题可能发生两种可能性; Java Memory Barrier(超出此问题的范围,但更多参考文献here)或时间安排。 main thread最有可能在thread2完成各自的run()方法之前阅读打印语句。


解决方案

  1. 一种方法可能是根本不使用多线程。线程的创建是一项非常昂贵的操作,不应经常执行。通常,在需要多线程thread-pools的应用程序中使用。

  2. 使用join()阻止功能。 Join强制调用线程(在这种情况下为main thread等待,以使相应线程在继续执行之前完成执行。

  3. 使用Promise来实现线程。该对象是Future类的包装,允许get()方法被阻塞。这意味着要 wait 的调用线程(在本例中为main thread),等待相应的线程在继续执行之前完成执行。可以在here中找到Promise的示例。