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()
来打印线程的名称。谢谢。这澄清了很多问题。我必须使用多线程,因为这是练习的目的,我的目标当然是将其用于多线程。在我的版本中,这是现在实现的,并且像我想要的那样工作!当然我很高兴我能帮助你学习和理解。