代码之家  ›  专栏  ›  技术社区  ›  Sinan Samet

在线程内使用方法

  •  1
  • Sinan Samet  · 技术社区  · 6 年前

    当我试图在我扩展的类中使用方法时 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函数还没有运行,所以它给了我false,而它应该是true。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Thiyagu    6 年前

    最后 System.out.println run 功能)完成。

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

    validIntegerPassPhrase.join();  //Need to handle the InterruptedException it might throw
    System.out.println(validIntegerPassPhrase.getPassPhrase() + " valid: " + validIntegerPassPhrase.isValid());
    
        2
  •  1
  •   Impurity    6 年前

    解释

    你所做的被称为 多线程 concurrency 或者并行。程序运行在 main thread 同时 . 所以,当你执行 start() thread 类,您正在使它分别执行 run()

    让我们逐步检查代码并分析场景。

    1. 线程对象由 main thread thread2 .

    2. 是由 主螺纹

    3. 螺纹2 以及 都是并行运行的。这意味着代码由他们两个(为了简单起见)在 同时

    4. 这一问题有两种可能; Java Memory Barrier (超出本问题范围,但更多参考) here 主螺纹 螺纹2 可以各自完成 运行() 方法。


    解决方案

    1. thread-pools 而是被利用。

    2. join() 阻塞功能。联合强制调用线程(在本例中,它将是 主螺纹 )到 使相应的线程在继续之前完成执行。

    3. 使用实现线程 Promise Future 类,考虑到 get() 主螺纹 )到 等待 承诺 可以找到的 here .