<T> Future<T> submit(Callable<T> task) 返回Callable任务执行结果的状态 Future<?> submit(Runnable task) 返回Runnable任务执行的状态 <T> Future<T> submit(Runnable task, T result) 返回Runnable任务执行的状态和 result 值
boolean cancel(boolean mayInterruptIfRunning) 尝试取消执行此任务。 V get() 等待计算完成,然后检索其结果。 V get(long timeout, TimeUnit unit) 如果在规定时间内得到结果就立刻返回,超时抛出TimeoutException boolean isCancelled() 如果此任务在正常完成之前被取消,则返回 true 。 boolean isDone() 如果任务已完成返回true。 完成可能是由于正常终止,异常或取消
调用get 之前最好 isDone判断一下,否则get将一直阻塞直到得到结果,或者使用超时get
ExecutorService pool = Executors.newFixedThreadPool(1); Future<String> submit = pool.submit(new Callable<String>() { @Override public String call() throws InterruptedException { Thread.sleep(5000); return "时间到"; } }); pool.shutdown(); System.out.println(new Date()); System.out.println(submit.get()); System.out.println(new Date()); Wed Aug 22 17:31:02 CST 2018 时间到 Wed Aug 22 17:31:07 CST 2018
FutureTask(Runnable runnable, V result) //Runnable 自身不返回结果,但可以设定返回一个V型值
FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() { @Override public String call() throws InterruptedException { Thread.sleep(5000); return "时间到"; } }); Thread thread = new Thread(futureTask); thread.start(); System.out.println(new Date()); System.out.println(futureTask.get()); System.out.println(new Date());
ExecutorService service = Executors.newCachedThreadPool(new DaemonThread(),); service.submit(new Prints()); class DaemonThread implements ThreadFactory{ @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setDaemon(true); return t; } }
lass SimpleThread extends Thread{ SimpleThread(){ start(); } @Override public void run() { System.out.println("继承Thread的任务类"); } }
class SelfManaged implements Runnable{ SelfManaged(){ thread.start(); } Thread thread = new Thread(this); @Override public void run() { System.out.println("内置Thread的任务类"); } }
class A extends Thread{ Thread b; A(Thread b){ this.b = b; start(); } @Override public void run() { System.out.println("A线程启动"); System.out.println("B线程加入"); try { b.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("A线程结束"); } } class B extends Thread{ B(){ start(); } @Override public void run() { System.out.println("B线程执行"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B结束执行"); } } B b = new B(); A a = new A(b);
public void run() { try { Thread.sleep(5); System.out.println("Prints"); throw new RuntimeException(); //任何地方无法捕获此异常 } catch (InterruptedException e) { e.printStackTrace(); } } Exception in thread "pool-1-thread-1" java.lang.RuntimeException at Prints.run(Main.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
由于Runnable的run方法没有throws 异常所以run中没被catch捕获的异常不会抛给上一级所以就丢失了,而Callable 中 call throws Exception 所以抛出异常后被上一级捕获, 通过Future get结果是可以的到异常信息。
public class Main { public static void main(String[] args) throws Exception { /* 设置默认处理程序 Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); ExecutorService service = Executors.newCachedThreadPool(); */ // 专有处理程序 ExecutorService service = Executors.newCachedThreadPool(new MyThreadFactory()); service.execute(new Prints()); } } class Prints implements Runnable { @Override public void run() { try { Thread.sleep(5); System.out.println("Prints"); throw new RuntimeException(); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyThreadFactory implements ThreadFactory{ @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); return t; } } class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(e); } }
int addAndGet(int delta) 将给定的值原子地添加到当前值。 int decrementAndGet() 减1再返回。 int get() 获取当前值。 int getAndAdd(int delta) 将给定的值原子地添加到当前值。 int getAndDecrement() 返回当前值再减1。 int getAndIncrement() 返回当前值再加1。 int getAndSet(int newValue) 将原子设置为给定值并返回旧值。 int getAndUpdate(IntUnaryOperator updateFunction) 用应用给定函数的结果原子更新当前值,返回上一个值。 int incrementAndGet() 加1再返回。
public void println(String x) { synchronized (this) { print(x); newLine(); } }
进入代码块必须获得synchronized 同步锁
public void print(){ synchronized(new Object()){ System.out.println("同步代码块"); } }
这是一个有问题的方法。不同线程new Object()肯定不是同一个对象,所以任何线程都能同时执行这段代码,要想做到同步就要使用唯一不变的对象作为锁。
public void print(){ synchronized(this){ System.out.println("同步代码块"); } } public synchronized void say(){ System.out.println("同步方法"); }
在中断就是为了结束任务,但Java没有提供中断任务的机制而是给出了中断标志位,让你自己去实现中断。
boolean add(E e) 将指定的元素插入,不成功则抛出IllegalStateException。 boolean offer(E e) 将指定的元素插入,不成功则返回false。 boolean offer(E e, long timeout, TimeUnit unit) 将指定的元素规定时间内插入。 void put(E e) 将指定的元素插入到此队列中,不成功则阻塞 E poll(long timeout, TimeUnit unit) 指定时间内取出头,否则返回false boolean remove(Object o) 从该队列中删除指定元素的单个实例(如果存在) E take() 取出队头元素,如果没有则一直阻塞
BlockingQueue部分实现
void await()
时当前任务挂起,直到计数器为0,自动唤醒执行。
boolean await(long timeout, TimeUnit unit)
设置超时时间
void countDown()
减少锁存器的计数,每次减1,如果计数达到零,释放所有等待的线程。
long getCount()
返回当前计数。
String toString()
返回一个标识此锁存器的字符串及其状态。
CyclicBarrier(int parties, Runnable barrierAction) 当 parties 个任务调用了await()时执行barrierAction任务。
int await() 挂起线程 int await(long timeout, TimeUnit unit) 设置超时时间 int getNumberWaiting() 返回目前正在等待障碍的各方的数量。 int getParties() 返回所需要的await数量。 boolean isBroken() 查看处于wait的线程是否被中断 void reset() 将屏障重置为初始状态。
void execute(Runnable command) 执行 command零要求延迟。 <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) 在到达延迟时间后执行任务并返回一个ScheduledFuture对象 ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) 在到达延迟时间后执行任务并返回一个ScheduledFuture对象
Semaphore(int permits)
创建一个许可数量为permits的 Semaphore,默认非公平模式。
Semaphore(int permits, boolean fair)
创建一个许可数量为permits的 Semaphore,可设置是否是公平模式。
void acquire()
取许1个可证,获取不到则一直阻塞直到可用,或线程为 interrupted
void acquire(int permits)
取许permits个可证,获取不到则一直阻塞直到可用,或线程为 interrupted
void release()
释放1个许可证,将其返回到信号量。
void release(int permits)
释放permits个许可证,将其返回到信号量。
原文:https://www.cnblogs.com/mibloom/p/9517069.html