我想在B的run()方法结束之后,(立即)在A类中做一些事情,请问应该如何实现?
12 个解决方案
#1
我现在是在B类中声明了一个A类变量,并且在b.start()之前向b传入A的当前实例(自身),然后将A类中做事情的函数设置为public,然后直接在run()的末尾执行。。。。感觉这样的写法非常差。有没有更好的方法?
#2
我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点
#3
B 中写一个内部接口,A 实现它,这样B就可以 让 A的对象 执行 某些操作了。
#4
?没看明白
我想实现的是:
在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
要监听的话必须是线程监听,用线程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
this.aLive()
恩,这个我也明白,可是具体怎么操作呢?难道写个死循环一直判断吗?
#11
可以用锁来实现同步: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
加标识位或者实现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
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
我希望是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
我希望是B类要对“执行完run()之后还要做一些事情”这一点一无所知,最好完全在A类里面实现这一点
要监听的话必须是线程监听,用线程B的isAlive()判断
this.aLive()
恩,这个我也明白,可是具体怎么操作呢?难道写个死循环一直判断吗?
#11
可以用锁来实现同步: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
加标识位或者实现Callable返回执行结果。
“标识位”是指“当B执行完毕之后,将某一变量boolean flag,由false置为true”吗?
如果是这样的话,那么A类中如何*监听*这一改变呢?总不至于用一个死循环一直判断吧。。。。。
Callable对我来说是新名词,我试试看