import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main {
static enum Some {
FOO;
}
static abstract class Foo {
public abstract Some getType();
}
static class FooExt extends Foo {
@Override
public Some getType() {
return Some.FOO;
}
}
public static void main
(String[] args
) {
ExecutorService service = Executors.newFixedThreadPool(2);
final CountDownLatch start = new CountDownLatch(1);
Future<Integer> f1 = service.submit(new Callable<Integer>() {
@Override
try {
start.await();
e.printStackTrace();
}
System.
out.
println("Task started..."); int a = 0;
Foo foo = new FooExt();
while (!Thread.
currentThread().
isInterrupted()) { if (foo instanceof FooExt) {
a++;
}
}
System.
out.
println("Task ended..."); return a;
}
});
Future<Integer> f2 = service.submit(new Callable<Integer>() {
@Override
try {
start.await();
e.printStackTrace();
}
System.
out.
println("Task started..."); int a = 0;
Foo foo = new FooExt();
while (!Thread.
currentThread().
isInterrupted()) { if (foo.getType() == Some.FOO) {
a++;
}
}
System.
out.
println("Task ended..."); return a;
}
});
start.countDown();
try {
}
service.shutdownNow();
System.
out.
println("service is shutdowned..."); try {
System.
out.
println("instanceof: "+f1.
get()); System.
out.
println("enum: "+f2.
get()); e.printStackTrace();
}
}
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgpzdGF0aWMgZW51bSBTb21lIHsKICAgIEZPTzsKfQoKc3RhdGljIGFic3RyYWN0IGNsYXNzIEZvbyB7CiAgICBwdWJsaWMgYWJzdHJhY3QgU29tZSBnZXRUeXBlKCk7Cn0KCnN0YXRpYyBjbGFzcyBGb29FeHQgZXh0ZW5kcyBGb28gewogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU29tZSBnZXRUeXBlKCkgewogICAgICAgIHJldHVybiBTb21lLkZPTzsKICAgIH0KfQoKcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgIEV4ZWN1dG9yU2VydmljZSBzZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgyKTsKICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0ID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgRnV0dXJlPEludGVnZXI+IGYxID0gc2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPEludGVnZXI+KCkgewogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGFydC5hd2FpdCgpOwogICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGFzayBzdGFydGVkLi4uIik7CiAgICAgICAgICAgIGludCBhID0gMDsKICAgICAgICAgICAgRm9vIGZvbyA9IG5ldyBGb29FeHQoKTsKICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgewogICAgICAgICAgICAgICAgaWYgKGZvbyBpbnN0YW5jZW9mIEZvb0V4dCkgewogICAgICAgICAgICAgICAgICAgIGErKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRhc2sgZW5kZWQuLi4iKTsKICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgfQogICAgfSk7CgogICAgRnV0dXJlPEludGVnZXI+IGYyID0gc2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPEludGVnZXI+KCkgewogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGFydC5hd2FpdCgpOwogICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGFzayBzdGFydGVkLi4uIik7CiAgICAgICAgICAgIGludCBhID0gMDsKICAgICAgICAgICAgRm9vIGZvbyA9IG5ldyBGb29FeHQoKTsKICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgewogICAgICAgICAgICAgICAgaWYgKGZvby5nZXRUeXBlKCkgPT0gU29tZS5GT08pIHsKICAgICAgICAgICAgICAgICAgICBhKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUYXNrIGVuZGVkLi4uIik7CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0KICAgIH0pOwogICAgc3RhcnQuY291bnREb3duKCk7CiAgICB0cnkgewogICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwogICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgfQogICAgc2VydmljZS5zaHV0ZG93bk5vdygpOwogICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXJ2aWNlIGlzIHNodXRkb3duZWQuLi4iKTsKICAgIHRyeSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbnN0YW5jZW9mOiAiK2YxLmdldCgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudW06ICIrZjIuZ2V0KCkpOwogICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgfQp9Cgp9