Java 在线程内使用方法

Java 在线程内使用方法,java,multithreading,Java,Multithreading,当我尝试在扩展Thread的类中使用方法时,它在运行后不会收到方法 我的班级: public class PassPhraseValidator<E> extends Thread { private List<E> list; private boolean isValid; private String passPhrase; public PassPhraseValidator(List<E> list) {

当我尝试在扩展
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扩展线程{
私人名单;
私有布尔值是有效的;
私有字符串密码短语;
公共密码短语evalidator(列表){
this.list=列表;
}
公共字符串getPassPhrase(){
返回密码短语;
}
公共布尔值isValid(){
返回有效;
}
公开募捐{
this.passPhrase=Arrays.toString(list.toArray());
this.isValid=list.stream();
}
}
所以当我像这样执行这个类时:

PassPhraseValidator<Integer> validIntegerPassPhrase = new PassPhraseValidator<>(Arrays.asList(12, 18, 15, 32));
validIntegerPassPhrase.start();
System.out.println(validIntegerPassPhrase.getPassPhrase() + " valid: " + validIntegerPassPhrase.isValid());
PassPhraseValidator validintegerpassphase=新的PassPhraseValidator(Arrays.asList(12,18,15,32));
ValidIntegerPassphase.start();
System.out.println(validIntegerPassPhrase.getPassPhrase()+“valid:”+validIntegerPassPhrase.isValid());
它给了我false,而它应该是true,因为run函数还没有运行


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

最后一个
System.out.println
语句不会等待线程(运行
函数)完成

等待其完成的一种方法是调用
join
方法

validIntegerPassPhrase.join();  //Need to handle the InterruptedException it might throw
System.out.println(validIntegerPassPhrase.getPassPhrase() + " valid: " + validIntegerPassPhrase.isValid());

解释

您所做的就是所谓的多线程。这允许多个线程执行代码或并行执行。程序运行在一种叫做。这意味着一个线程正在系统地执行所有代码;一个接一个的指令。当引入像您这样的另一个线程时,程序的执行同时在不同的逻辑上完成。因此,当您在
线程
类的实现上执行
start()
方法时,您使它在后台执行相应的
run()
方法,直到;它完成后,抛出异常、关闭应用程序或停止线程

让我们逐步完成代码并分析场景

  • 线程对象由
    主线程
    实例化。让我们调用这个新线程
    thread2

  • thread2
    主线程启动

  • thread2
    主线程都并行运行。这意味着他们两人同时执行代码(为了简单起见)

  • 这一问题可能出现两种可能性;(超出本问题范围,但更多参考)或时间。
    主线程
    很可能在
    thread2
    完成其各自的
    run()
    方法之前读取打印语句


  • 解决方案

  • 一种方法可能是根本不使用多线程。创建线程是一项成本相当高的操作,不应经常进行。通常,使用需要多线程的应用程序内

  • 利用
    join()
    阻塞功能。Join强制调用线程(在本例中,它将是
    主线程
    )在继续之前等待各自的线程完成执行

  • 使用
    Promise
    实现线程。这个对象是
    Future
    类的包装器,允许
    get()
    方法被阻塞。这意味着调用线程(在本例中,它将是
    主线程
    )在继续之前等待相应的线程完成执行。可以找到
    承诺
    的示例


  • 布尔字段的默认值为false!它从这个值开始!除此之外,多线程中还有潜在的可见性问题!谢谢你的工作!我预感它在run()之前运行过,但我不知道如何处理它。调用
    run
    会使它在主线程本身上运行(这会破坏线程的用途),这让我有点困惑。你是说我不应该这样做?我是否应该只放置
    返回array.toString(list.toArray())例如在
    getPassPhrase()
    中?我的意思是如果您执行
    validIntegerPassPhrase.run()
    ,则不会创建新线程。
    run
    逻辑将在主线程本身上运行。您可以通过
    thread.currentThread().getName()
    来打印线程的名称。谢谢。这澄清了很多问题。我必须使用多线程,因为这是练习的目的,我的目标当然是将其用于多线程。在我的版本中,这是现在实现的,并且像我想要的那样工作!当然我很高兴我能帮助你学习和理解。