Java 不“连接”中断的线程可以吗?

Java 不“连接”中断的线程可以吗?,java,android,multithreading,Java,Android,Multithreading,我有一个纸牌游戏应用程序,机器人的手必须在多个弃牌中进行选择,以优化其手牌。因此,我将对可能的放弃选择进行线程处理,然后计算手动估值。我使用两种不同的方法进行手工估价;一个是详尽的,但可能非常昂贵,另一个是启发式的,非常快。一旦计算时间超过500毫秒,我就从穷举法切换到启发式法。我通过在可能的丢弃上启动线程,然后也启动一个睡眠线程来实现这一点。当它完成睡眠时,它会中断其他线程,然后我用启发式方法重新运行它们 所有这些都可以正常工作,但是在检查连接循环中的中断线程时,我立即抛出Interrupte

我有一个纸牌游戏应用程序,机器人的手必须在多个弃牌中进行选择,以优化其手牌。因此,我将对可能的放弃选择进行线程处理,然后计算手动估值。我使用两种不同的方法进行手工估价;一个是详尽的,但可能非常昂贵,另一个是启发式的,非常快。一旦计算时间超过500毫秒,我就从穷举法切换到启发式法。我通过在可能的丢弃上启动线程,然后也启动一个睡眠线程来实现这一点。当它完成睡眠时,它会中断其他线程,然后我用启发式方法重新运行它们

所有这些都可以正常工作,但是在检查连接循环中的中断线程时,我立即抛出InterruptedException,以便调用方知道如何重新运行计算。这样做,我永远不会加入其他中断的线程。这是资源泄漏,还是其他线程最终会被清除

代码片段如下: 启动我的线程:

    for (Card disCard : cardsWithAdded) {
        CardList cards = new CardList(cardsWithAdded);
        cards.remove(disCard);

        testHand[iThread] = new ThreadedHand(this.hand.getRoundOf(), cards, disCard, this.method, isFinalTurn); //creates new hand with replaced cards
        t[iThread] = new Thread(threadGroup,testHand[iThread]);
        t[iThread].start(); //calls meldAndEvaluate
        iThread++;
    }
在睡眠线程中中断它们:

        public void run() {
        final long sleepStartTime = System.currentTimeMillis();
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            // if interrupted, this means the other threads finished their work before the sleep ended
            return;
        }
        threadGroup.interrupt(); //interrupt the other calculation threads
    }
检查循环中的计算线程是否中断:

        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
在运行中设置标志:

        public void run()  {
        threadStart = System.currentTimeMillis();
        wasThreadInterrupted = false;
        try {
            this.meldAndEvaluate(this.method, EasyComputerPlayer.this , this.isFinalTurn);
        } catch (InterruptedException e) {
            //just break out of this thread
            threadStop = System.currentTimeMillis();
            wasThreadInterrupted = true;
        }
        threadStop = System.currentTimeMillis();
    }
以及我在第一个中断线程处断开的连接:

         for (int iThread=0; iThread < this.numThreads; iThread++) {
        try {
            t[iThread].join();
        } catch (InterruptedException e) {
            throw new InterruptedException(String.format("%s-%s: findBestHandFinish interrupted in join()...",FiveKings.APP_TAG,Thread.currentThread().getName()));
        }
        //can only test this flag after we've rejoined the thread to this one
        if (testHand[iThread].wasThreadInterrupted()) throw new InterruptedException(String.format("After join: Thread %s shows was-interrupted - throwing exception", t[iThread].getName()));

连接螺纹是不必要的。。。或足以防止资源泄漏

实际上:

当线程终止1时,线程堆栈符合回收条件。如果线程没有对中断做出适当的响应,即终止自身,那么就存在资源泄漏

在线程终止并且没有对该对象的可访问引用后,线程对象有资格回收。但是线程对象的泄漏是一个简单的内存泄漏,而不是正常意义上的资源泄漏


1-当run方法终止时,线程终止,通常是通过返回,或者由于未检查异常的传播而异常终止。

不需要加入线程。。。或足以防止资源泄漏

实际上:

当线程终止1时,线程堆栈符合回收条件。如果线程没有对中断做出适当的响应,即终止自身,那么就存在资源泄漏

在线程终止并且没有对该对象的可访问引用后,线程对象有资格回收。但是线程对象的泄漏是一个简单的内存泄漏,而不是正常意义上的资源泄漏


1-当run方法终止时,线程终止,通常是通过返回,或者是由于未检查异常的传播而异常终止。

调用t.join除了等待线程t死亡外,不会执行任何操作。它对线程t没有任何作用。

调用t.join除了等待线程t死亡之外,没有任何作用。它对线程t根本没有任何作用。

当你说终止它本身时,我所做的是合适的吗?我在循环中侦听中断,然后抛出InterruptedException。大概当run返回线程终止时?看起来还可以,但代码示例的碎片特性使它很难确定。当你说终止本身时,我所做的是合适的吗?我在循环中侦听中断,然后抛出InterruptedException。大概当run返回线程终止时?看起来还可以,但代码示例的碎片特性使它很难确定。我认为您所做的并不好。不是因为你加入/不加入线程。更重要的是,您创建了一个非常脆弱的系统,可以通过期货和执行者很好地实现。这是一个如何实现的示例。非同步设置和读取线程中的布尔值也不会可靠地工作,除非您将其设置为易失性。感谢您的建议-我会看一看。我认为您所做的不是很好。不是因为你加入/不加入线程。更重要的是,您创建了一个非常脆弱的系统,可以通过期货和执行者很好地实现。这是一个如何实现的示例。未同步的设置和读取线程中的布尔值也将无法可靠工作,除非您将其设置为易失性。谢谢您的建议-我会看一看。