package com.vip.saturn.job.utils;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.vip.saturn.job.threads.SaturnThreadFactory;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledThreadPoolExecutor timeoutExecutor = new ScheduledThreadPoolExecutor(Math.max(2, Runtime.getRuntime().availableProcessors() / 2), new SaturnThreadFactory( "-timeout-watchdog"));
timeoutExecutor.setRemoveOnCancelPolicy(true);
ExecutorService executorService = Executors.newSingleThreadExecutor(new SaturnThreadFactory( "test"));
ThreadA a = new ThreadA();
Future<String> future = executorService.submit(a);
timeoutExecutor.schedule(new TimeoutHandleTask(a), 2, TimeUnit.SECONDS);
String res = future.get();
System.out.println("res:" + res);
a = new ThreadA();
future = executorService.submit(a);
res = future.get();
System.out.println("res:" + res);
}
}
class TimeoutHandleTask implements Runnable {
private ThreadA threadA;
public TimeoutHandleTask(ThreadA threadA){
this.threadA = threadA;
}
@Override
public void run() {
try {
threadA.getCurrentThread().stop();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
class ThreadA implements Callable<String> {
private Thread currentThread;
public Thread getCurrentThread() {
return currentThread;
}
@Override
public String call() throws Exception {
currentThread = Thread.currentThread();
try {
System.out.println("i am threadA ;"+currentThread.toString());
for (int i = 0; i < 1000; i++) {
Thread.sleep(10);
}
} catch (Throwable e) {
System.out.println("threadA is stopping");
}
System.out.println("threadA is stopped");
return "a";
}
}