Callable和Runnable不一样,Runnable运行了之后不会等待结果的返回,而Callable执行一个线程的时候,主线程会等待结果的返回。
- package com.test.www;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.FutureTask;
- public class mainTest {
- public static void main(String[] args) throws InterruptedException, ExecutionException {
- //实现一个runable,返回字符串的结果
- class Test implements Callable<String> {
- //volatile 关键词,保证了该域的读写安全
- private volatile int ticket = 10; //10张火车票
- private void sale() {
- if (ticket > 0) {
- System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余:" + ticket--);
- }
- }
- @Override
- public String call() throws Exception {
- int i = 10;
- while (i > 0) {
- i--;
- try {
- Thread.sleep(1000); //sleep 2秒
- } catch (Exception e) {
- }
- sale(); //卖一张票
- }
- return Thread.currentThread().getName() + " 下班了";
- }
- }
- Test test = new Test();
- FutureTask<String> futrue = new FutureTask<String>(test); //使用futrue来接收异步的Callable
- new Thread(futrue, "A窗口").start(); //这边是阻塞等待
- System.out.println(futrue.get() + " "); //接收到Callable的返回值
- }
- }
结果:
A窗口卖出一张票,剩余:10
A窗口卖出一张票,剩余:9
A窗口卖出一张票,剩余:8
A窗口卖出一张票,剩余:7
A窗口卖出一张票,剩余:6
A窗口卖出一张票,剩余:5
A窗口卖出一张票,剩余:4
A窗口卖出一张票,剩余:3
A窗口卖出一张票,剩余:2
A窗口卖出一张票,剩余:1
A窗口 下班了