如何“监听”线程结束?

时间:2022-04-10 22:36:22
Class B extends Thread,在A类中使用b.start()来启动线程
我想在B的run()方法结束之后,(立即)在A类中做一些事情,请问应该如何实现?

12 个解决方案

#1


我现在是在B类中声明了一个A类变量,并且在b.start()之前向b传入A的当前实例(自身),然后将A类中做事情的函数设置为public,然后直接在run()的末尾执行。。。。感觉这样的写法非常差。有没有更好的方法?

#2


我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

#3


B 中写一个内部接口,A 实现它,这样B就可以 让 A的对象 执行 某些操作了。

#4


引用 3 楼 freeman527 的回复:
B 中写一个内部接口,A 实现它,这样B就可以 让 A的对象 执行 某些操作了。

?没看明白

我想实现的是:
在B的run()方法结束之后,A类立刻知道了这件事,并且由A类的实例来执行某个A类中的函数。而不是像这样:


class B extends Thread {
A a;

//将A类实例传入B类的实例中
B(A a) {
this.a = a;
}

@Override
void run() {
// run() 函数本身要执行的操作
// ......
// run()函数执行完毕
a.doSomething();
}
}
 

#5


高手在哪字数补丁

#6


引用 2 楼 zhengkai2001 的回复:
我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

要监听的话必须是线程监听,用线程B的isAlive()判断

#7


加标识位或者实现Callable返回执行结果。

#8


可以用锁来实现同步:

package com.alibaba.app;

public class A {
    
    static Object lock = new Object();

    class B extends Thread {
        
        @Override
        public void run() {
            synchronized (lock) {
                doSomeThing();
                lock.notify();
            }
        }
        
        private void doSomeThing() {
            System.out.println("B do something...");
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        B b = new A().new B();
        b.start();
        synchronized (lock) {
            lock.wait();
            doSomeThing();
        }
    }

    private static void doSomeThing() {
        System.out.println("A do something...");
    }
}

#9


this.aLive()

#10


引用 6 楼 levelmini 的回复:
Quote: 引用 2 楼 zhengkai2001 的回复:

我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

要监听的话必须是线程监听,用线程B的isAlive()判断


引用 9 楼 lsh670660992 的回复:
this.aLive()


恩,这个我也明白,可是具体怎么操作呢?难道写个死循环一直判断吗?

#11


引用 8 楼 yaojiank 的回复:
可以用锁来实现同步:

package com.alibaba.app;

public class A {
    
    static Object lock = new Object();

    class B extends Thread {
        
        @Override
        public void run() {
            synchronized (lock) {
                doSomeThing();
                lock.notify();
            }
        }
        
        private void doSomeThing() {
            System.out.println("B do something...");
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        B b = new A().new B();
        b.start();
        synchronized (lock) {
            lock.wait();
            doSomeThing();
        }
    }

    private static void doSomeThing() {
        System.out.println("A do something...");
    }
}


谢谢你的回复,这个方法也挺好,但也需要改变B中的run()函数。。。无论如何,我先尝试一下,谢谢。

#12


引用 7 楼 gaofuqi 的回复:
加标识位或者实现Callable返回执行结果。

“标识位”是指“当B执行完毕之后,将某一变量boolean flag,由false置为true”吗?
如果是这样的话,那么A类中如何*监听*这一改变呢?总不至于用一个死循环一直判断吧。。。。。

Callable对我来说是新名词,我试试看

#1


我现在是在B类中声明了一个A类变量,并且在b.start()之前向b传入A的当前实例(自身),然后将A类中做事情的函数设置为public,然后直接在run()的末尾执行。。。。感觉这样的写法非常差。有没有更好的方法?

#2


我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

#3


B 中写一个内部接口,A 实现它,这样B就可以 让 A的对象 执行 某些操作了。

#4


引用 3 楼 freeman527 的回复:
B 中写一个内部接口,A 实现它,这样B就可以 让 A的对象 执行 某些操作了。

?没看明白

我想实现的是:
在B的run()方法结束之后,A类立刻知道了这件事,并且由A类的实例来执行某个A类中的函数。而不是像这样:


class B extends Thread {
A a;

//将A类实例传入B类的实例中
B(A a) {
this.a = a;
}

@Override
void run() {
// run() 函数本身要执行的操作
// ......
// run()函数执行完毕
a.doSomething();
}
}
 

#5


高手在哪字数补丁

#6


引用 2 楼 zhengkai2001 的回复:
我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

要监听的话必须是线程监听,用线程B的isAlive()判断

#7


加标识位或者实现Callable返回执行结果。

#8


可以用锁来实现同步:

package com.alibaba.app;

public class A {
    
    static Object lock = new Object();

    class B extends Thread {
        
        @Override
        public void run() {
            synchronized (lock) {
                doSomeThing();
                lock.notify();
            }
        }
        
        private void doSomeThing() {
            System.out.println("B do something...");
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        B b = new A().new B();
        b.start();
        synchronized (lock) {
            lock.wait();
            doSomeThing();
        }
    }

    private static void doSomeThing() {
        System.out.println("A do something...");
    }
}

#9


this.aLive()

#10


引用 6 楼 levelmini 的回复:
Quote: 引用 2 楼 zhengkai2001 的回复:

我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点

要监听的话必须是线程监听,用线程B的isAlive()判断


引用 9 楼 lsh670660992 的回复:
this.aLive()


恩,这个我也明白,可是具体怎么操作呢?难道写个死循环一直判断吗?

#11


引用 8 楼 yaojiank 的回复:
可以用锁来实现同步:

package com.alibaba.app;

public class A {
    
    static Object lock = new Object();

    class B extends Thread {
        
        @Override
        public void run() {
            synchronized (lock) {
                doSomeThing();
                lock.notify();
            }
        }
        
        private void doSomeThing() {
            System.out.println("B do something...");
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        B b = new A().new B();
        b.start();
        synchronized (lock) {
            lock.wait();
            doSomeThing();
        }
    }

    private static void doSomeThing() {
        System.out.println("A do something...");
    }
}


谢谢你的回复,这个方法也挺好,但也需要改变B中的run()函数。。。无论如何,我先尝试一下,谢谢。

#12


引用 7 楼 gaofuqi 的回复:
加标识位或者实现Callable返回执行结果。

“标识位”是指“当B执行完毕之后,将某一变量boolean flag,由false置为true”吗?
如果是这样的话,那么A类中如何*监听*这一改变呢?总不至于用一个死循环一直判断吧。。。。。

Callable对我来说是新名词,我试试看