0
点赞
收藏
分享

微信扫一扫

Java JUC高并发编程(三)

向上的萝卜白菜 2022-04-13 阅读 38
java

一、Callable接口

Callable接口方法:
1.V call():计算结果,如果无法计算结果,则抛出一个异常。 

Callable接口和Runnable接口区别?

1、Callable接口有返回值,Runnable接口没有返回值

2、Callable接口call方法可以抛出异常,Runnable接口中run方法不能抛出异常

3、实现方法名不同一个是call一个是run

FutureTask是Runnable接口的一个实现类,并且此实现类的构造方法和Callable有关。

所以可通过FutureTask来创建Callable接口的多线程任务。

FutureTask是Runnable接口的一个实现类,并且此实现类的构造方法和Callable有关。
public class FutureTask<V>extends Objectimplements RunnableFuture<V>

FutureTask构造方法:
1.FutureTask(Callable<V> callable):创建一个 FutureTask,一旦运行就执行给定的Callable 
2.FutureTask(Runnable runnable, V result):创建一个 FutureTask,一旦运行就执行给定的
Runnable,并安排成功完成时 get 返回给定的结果

FutureTask常用的方法:
1.boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。 
2.protected  void done():当此任务转换到状态 isDone(不管是正常地还是通过取消)时,
调用受保护的方法。 
3.V get():如有必要,等待计算完成,然后获取其结果。 
4.V get(long timeout, TimeUnit unit):如有必要,最多等待为使计算完成所给定的时间之后,
获取其结果(如果结果可用)。 
5.boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。 
6.boolean isDone():如果任务已完成,则返回 true。 
7.void run():除非已将此 Future 取消,否则将其设置为其计算的结果。 
8.protected  boolean runAndReset():执行计算而不设置其结果,然后将此 Future 重置为
初始状态,如果计算遇到异常或已取消,则该操作失败。 
9.protected  void set(V v):除非已经设置了此 Future 或已将其取消,否则将其结果设置为
给定的值。 
10.protected  void setException(Throwable t):除非已经设置了此 Future 或已将其取消,
否则它将报告一个 ExecutionException,并将给定的 throwable 作为其原因。

Callable接口和Runnable接口示例:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo6 {

	public static void main(String[] args) throws Exception {
		new Thread(new MyThread1(),"A").start();
		
		FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread2());
		
		FutureTask<Integer> futureTask2 = new FutureTask<Integer>(() ->{
			return 300;
		});
		
		new Thread(futureTask2,"B").start();
		new Thread(futureTask,"C").start();

		while (!futureTask2.isDone()) {
			System.out.println("wait...");
		}
		
		System.out.println(futureTask2.get());
	}
}

class MyThread1 implements Runnable{

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+" in Runnable");
	}
}

class MyThread2 implements Callable<Integer>{

	@Override
	public Integer call() throws Exception {
		System.out.println(Thread.currentThread().getName()+" in callable");
		return 200;
	}
	
}

二、JUC辅助类

1、减少计数CountDownLatch

2、循环栅栏CyclicBarrier

3、信号灯Semaphore

Java JUC高并发编程(一)

举报

相关推荐

0 条评论