多线程的学习

以下将展示3个多线程的代码展示

  • 前两个是Runnable,第三个是Callable
  • 第三个使用了Future类,类似于异步任务,先执行后面的,等后面得到值再赋值

多线程代码1 

package 多线程;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CurrentChatTest {
    
    //定义CyclicBarrier 的屏障,需要等多少个线程到了才发起请求
    CyclicBarrier cyclicBarrier = new CyclicBarrier(100);
 
    private void runThread() {
    //定义线程池
        ExecutorService executorService = Executors.newFixedThreadPool(200);
     //执行线程
        for (int i = 0; i < 200; i++) {
            executorService.submit(buildThread(i));
            System.out.println(1);
        }
        System.out.println(3);
    }
 
    private Thread buildThread(int i) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Thread:" + Thread.currentThread().getName() + "准备...");
                    //cyclicBarrier一定要等到满200个线程到了才往后执行
                    cyclicBarrier.await();
                    System.out.println("Thread:" + Thread.currentThread().getName() + "开始执行");
                    //do something
 
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }
        });
        thread.setName("name:" + i);
        return thread;
    }
 
    public static void main(String[] args) {
        CurrentChatTest currentChatTest = new CurrentChatTest();
        currentChatTest.runThread();
    }
}

代码1的输出。

我们可以留意System.out.println(3);的输出,执行完这句话,输出了3。100以后的id才开始执行。

因为多线程被CyclicBarrier cyclicBarrier = new CyclicBarrier(100);拦截了。而主程序会继续执行后面的话,不管前面的多线程有没被执行完整

1
Thread:pool-1-thread-1准备...
1
Thread:pool-1-thread-2准备...
1
Thread:pool-1-thread-3准备...
1
Thread:pool-1-thread-4准备...
1
Thread:pool-1-thread-5准备...
1
Thread:pool-1-thread-6准备...
1
Thread:pool-1-thread-7准备...
1
1
Thread:pool-1-thread-8准备...
Thread:pool-1-thread-9准备...
1
Thread:pool-1-thread-10准备...
1
Thread:pool-1-thread-11准备...
1
Thread:pool-1-thread-12准备...
1
Thread:pool-1-thread-13准备...
1
Thread:pool-1-thread-14准备...
1
Thread:pool-1-thread-15准备...
1
Thread:pool-1-thread-16准备...
1
Thread:pool-1-thread-17准备...
1
Thread:pool-1-thread-18准备...
1
Thread:pool-1-thread-19准备...
1
Thread:pool-1-thread-20准备...
1
Thread:pool-1-thread-21准备...
1
Thread:pool-1-thread-22准备...
1
Thread:pool-1-thread-23准备...
1
Thread:pool-1-thread-24准备...
1
1
Thread:pool-1-thread-25准备...
1
Thread:pool-1-thread-26准备...
1
Thread:pool-1-thread-27准备...
1
Thread:pool-1-thread-28准备...
Thread:pool-1-thread-29准备...
1
Thread:pool-1-thread-30准备...
1
Thread:pool-1-thread-31准备...
1
Thread:pool-1-thread-32准备...
1
Thread:pool-1-thread-33准备...
1
Thread:pool-1-thread-34准备...
1
1
Thread:pool-1-thread-35准备...
Thread:pool-1-thread-36准备...
1
Thread:pool-1-thread-37准备...
1
Thread:pool-1-thread-38准备...
1
1
Thread:pool-1-thread-39准备...
Thread:pool-1-thread-40准备...
1
Thread:pool-1-thread-41准备...
1
Thread:pool-1-thread-42准备...
1
Thread:pool-1-thread-43准备...
1
Thread:pool-1-thread-44准备...
1
Thread:pool-1-thread-45准备...
1
Thread:pool-1-thread-46准备...
1
Thread:pool-1-thread-47准备...
1
1
Thread:pool-1-thread-48准备...
Thread:pool-1-thread-49准备...
1
1
Thread:pool-1-thread-50准备...
1
Thread:pool-1-thread-51准备...
Thread:pool-1-thread-52准备...
1
Thread:pool-1-thread-53准备...
1
1
Thread:pool-1-thread-54准备...
1
Thread:pool-1-thread-55准备...
1
Thread:pool-1-thread-56准备...
Thread:pool-1-thread-57准备...
1
Thread:pool-1-thread-58准备...
1
Thread:pool-1-thread-59准备...
1
Thread:pool-1-thread-60准备...
1
Thread:pool-1-thread-61准备...
1
Thread:pool-1-thread-62准备...
1
Thread:pool-1-thread-63准备...
1
Thread:pool-1-thread-64准备...
1
Thread:pool-1-thread-65准备...
1
Thread:pool-1-thread-66准备...
1
Thread:pool-1-thread-67准备...
1
Thread:pool-1-thread-68准备...
1
Thread:pool-1-thread-69准备...
1
Thread:pool-1-thread-70准备...
1
1
Thread:pool-1-thread-71准备...
Thread:pool-1-thread-72准备...
1
Thread:pool-1-thread-73准备...
1
Thread:pool-1-thread-74准备...
1
Thread:pool-1-thread-75准备...
1
Thread:pool-1-thread-76准备...
1
Thread:pool-1-thread-77准备...
1
Thread:pool-1-thread-78准备...
1
1
Thread:pool-1-thread-79准备...
1
Thread:pool-1-thread-80准备...
Thread:pool-1-thread-81准备...
1
Thread:pool-1-thread-82准备...
1
Thread:pool-1-thread-83准备...
1
Thread:pool-1-thread-84准备...
1
Thread:pool-1-thread-85准备...
1
1
Thread:pool-1-thread-86准备...
1
Thread:pool-1-thread-87准备...
1
Thread:pool-1-thread-88准备...
Thread:pool-1-thread-89准备...
1
Thread:pool-1-thread-90准备...
1
1
Thread:pool-1-thread-91准备...
1
Thread:pool-1-thread-92准备...
Thread:pool-1-thread-93准备...
1
Thread:pool-1-thread-94准备...
1
Thread:pool-1-thread-95准备...
1
Thread:pool-1-thread-96准备...
1
Thread:pool-1-thread-97准备...
1
Thread:pool-1-thread-98准备...
1
Thread:pool-1-thread-99准备...
1
Thread:pool-1-thread-100准备...
1
1
Thread:pool-1-thread-101准备...
Thread:pool-1-thread-1开始执行
1
Thread:pool-1-thread-3开始执行
Thread:pool-1-thread-2开始执行
Thread:pool-1-thread-102准备...
Thread:pool-1-thread-4开始执行
Thread:pool-1-thread-7开始执行
Thread:pool-1-thread-9开始执行
Thread:pool-1-thread-12开始执行
Thread:pool-1-thread-14开始执行
Thread:pool-1-thread-100开始执行
Thread:pool-1-thread-6开始执行
Thread:pool-1-thread-5开始执行
Thread:pool-1-thread-24开始执行
1
Thread:pool-1-thread-29开始执行
Thread:pool-1-thread-104准备...
Thread:pool-1-thread-28开始执行
Thread:pool-1-thread-27开始执行
1
Thread:pool-1-thread-33开始执行
Thread:pool-1-thread-26开始执行
Thread:pool-1-thread-25开始执行
Thread:pool-1-thread-36开始执行
Thread:pool-1-thread-37开始执行
Thread:pool-1-thread-39开始执行
Thread:pool-1-thread-41开始执行
Thread:pool-1-thread-23开始执行
Thread:pool-1-thread-47开始执行
Thread:pool-1-thread-49开始执行
Thread:pool-1-thread-22开始执行
Thread:pool-1-thread-54开始执行
Thread:pool-1-thread-55开始执行
Thread:pool-1-thread-21开始执行
Thread:pool-1-thread-60开始执行
Thread:pool-1-thread-20开始执行
Thread:pool-1-thread-103准备...
Thread:pool-1-thread-19开始执行
Thread:pool-1-thread-68开始执行
Thread:pool-1-thread-18开始执行
Thread:pool-1-thread-17开始执行
Thread:pool-1-thread-16开始执行
Thread:pool-1-thread-15开始执行
Thread:pool-1-thread-78开始执行
Thread:pool-1-thread-13开始执行
Thread:pool-1-thread-84开始执行
Thread:pool-1-thread-86开始执行
Thread:pool-1-thread-11开始执行
Thread:pool-1-thread-91开始执行
Thread:pool-1-thread-94开始执行
Thread:pool-1-thread-10开始执行
Thread:pool-1-thread-98开始执行
Thread:pool-1-thread-8开始执行
Thread:pool-1-thread-99开始执行
Thread:pool-1-thread-97开始执行
Thread:pool-1-thread-96开始执行
Thread:pool-1-thread-95开始执行
Thread:pool-1-thread-92开始执行
Thread:pool-1-thread-93开始执行
Thread:pool-1-thread-90开始执行
Thread:pool-1-thread-89开始执行
Thread:pool-1-thread-88开始执行
Thread:pool-1-thread-87开始执行
Thread:pool-1-thread-85开始执行
Thread:pool-1-thread-83开始执行
Thread:pool-1-thread-82开始执行
Thread:pool-1-thread-81开始执行
Thread:pool-1-thread-80开始执行
Thread:pool-1-thread-79开始执行
Thread:pool-1-thread-77开始执行
Thread:pool-1-thread-76开始执行
Thread:pool-1-thread-75开始执行
Thread:pool-1-thread-74开始执行
Thread:pool-1-thread-73开始执行
Thread:pool-1-thread-71开始执行
Thread:pool-1-thread-72开始执行
Thread:pool-1-thread-70开始执行
Thread:pool-1-thread-69开始执行
Thread:pool-1-thread-67开始执行
Thread:pool-1-thread-66开始执行
Thread:pool-1-thread-65开始执行
Thread:pool-1-thread-64开始执行
Thread:pool-1-thread-63开始执行
Thread:pool-1-thread-62开始执行
Thread:pool-1-thread-61开始执行
Thread:pool-1-thread-106准备...
Thread:pool-1-thread-105准备...
Thread:pool-1-thread-59开始执行
Thread:pool-1-thread-58开始执行
Thread:pool-1-thread-57开始执行
Thread:pool-1-thread-56开始执行
Thread:pool-1-thread-53开始执行
Thread:pool-1-thread-52开始执行
Thread:pool-1-thread-51开始执行
Thread:pool-1-thread-50开始执行
Thread:pool-1-thread-48开始执行
Thread:pool-1-thread-46开始执行
Thread:pool-1-thread-45开始执行
Thread:pool-1-thread-44开始执行
Thread:pool-1-thread-43开始执行
Thread:pool-1-thread-42开始执行
Thread:pool-1-thread-40开始执行
Thread:pool-1-thread-38开始执行
1
Thread:pool-1-thread-35开始执行
Thread:pool-1-thread-34开始执行
Thread:pool-1-thread-32开始执行
Thread:pool-1-thread-31开始执行
Thread:pool-1-thread-30开始执行
1
Thread:pool-1-thread-107准备...
1
Thread:pool-1-thread-108准备...
1
Thread:pool-1-thread-109准备...
1
1
Thread:pool-1-thread-111准备...
Thread:pool-1-thread-110准备...
1
1
Thread:pool-1-thread-112准备...
Thread:pool-1-thread-113准备...
1
Thread:pool-1-thread-114准备...
1
1
Thread:pool-1-thread-115准备...
Thread:pool-1-thread-116准备...
1
Thread:pool-1-thread-117准备...
1
1
Thread:pool-1-thread-118准备...
Thread:pool-1-thread-119准备...
1
Thread:pool-1-thread-120准备...
1
1
Thread:pool-1-thread-121准备...
Thread:pool-1-thread-122准备...
1
Thread:pool-1-thread-123准备...
1
Thread:pool-1-thread-124准备...
1
Thread:pool-1-thread-125准备...
1
1
Thread:pool-1-thread-126准备...
Thread:pool-1-thread-127准备...
1
1
Thread:pool-1-thread-128准备...
Thread:pool-1-thread-129准备...
1
Thread:pool-1-thread-130准备...
1
Thread:pool-1-thread-131准备...
1
1
Thread:pool-1-thread-132准备...
1
Thread:pool-1-thread-133准备...
Thread:pool-1-thread-134准备...
1
1
Thread:pool-1-thread-135准备...
Thread:pool-1-thread-136准备...
1
Thread:pool-1-thread-137准备...
1
Thread:pool-1-thread-138准备...
1
Thread:pool-1-thread-139准备...
1
Thread:pool-1-thread-140准备...
1
1
Thread:pool-1-thread-141准备...
1
Thread:pool-1-thread-142准备...
Thread:pool-1-thread-143准备...
1
Thread:pool-1-thread-144准备...
1
1
Thread:pool-1-thread-145准备...
Thread:pool-1-thread-146准备...
1
Thread:pool-1-thread-147准备...
1
Thread:pool-1-thread-148准备...
1
Thread:pool-1-thread-149准备...
1
1
Thread:pool-1-thread-150准备...
1
Thread:pool-1-thread-151准备...
Thread:pool-1-thread-152准备...
1
Thread:pool-1-thread-153准备...
1
1
Thread:pool-1-thread-154准备...
Thread:pool-1-thread-155准备...
1
1
Thread:pool-1-thread-156准备...
1
Thread:pool-1-thread-157准备...
1
Thread:pool-1-thread-158准备...
Thread:pool-1-thread-159准备...
1
Thread:pool-1-thread-160准备...
1
Thread:pool-1-thread-161准备...
1
Thread:pool-1-thread-162准备...
1
Thread:pool-1-thread-163准备...
1
1
Thread:pool-1-thread-164准备...
Thread:pool-1-thread-165准备...
1
Thread:pool-1-thread-166准备...
1
Thread:pool-1-thread-167准备...
1
1
1
Thread:pool-1-thread-168准备...
Thread:pool-1-thread-169准备...
Thread:pool-1-thread-170准备...
1
Thread:pool-1-thread-171准备...
1
Thread:pool-1-thread-172准备...
1
Thread:pool-1-thread-173准备...
1
Thread:pool-1-thread-174准备...
1
Thread:pool-1-thread-175准备...
1
Thread:pool-1-thread-176准备...
1
Thread:pool-1-thread-177准备...
1
Thread:pool-1-thread-178准备...
1
1
Thread:pool-1-thread-179准备...
1
Thread:pool-1-thread-180准备...
1
Thread:pool-1-thread-181准备...
1
Thread:pool-1-thread-182准备...
1
Thread:pool-1-thread-183准备...
1
Thread:pool-1-thread-184准备...
Thread:pool-1-thread-185准备...
1
Thread:pool-1-thread-186准备...
1
Thread:pool-1-thread-187准备...
1
Thread:pool-1-thread-188准备...
1
Thread:pool-1-thread-189准备...
1
Thread:pool-1-thread-190准备...
1
Thread:pool-1-thread-191准备...
1
Thread:pool-1-thread-192准备...
1
Thread:pool-1-thread-193准备...
1
Thread:pool-1-thread-194准备...
1
Thread:pool-1-thread-195准备...
1
Thread:pool-1-thread-196准备...
1
Thread:pool-1-thread-197准备...
1
Thread:pool-1-thread-198准备...
1
Thread:pool-1-thread-199准备...
1
3
Thread:pool-1-thread-200准备...
Thread:pool-1-thread-200开始执行
Thread:pool-1-thread-101开始执行
Thread:pool-1-thread-102开始执行
Thread:pool-1-thread-104开始执行
Thread:pool-1-thread-103开始执行
Thread:pool-1-thread-105开始执行
Thread:pool-1-thread-107开始执行
Thread:pool-1-thread-106开始执行
Thread:pool-1-thread-111开始执行
Thread:pool-1-thread-109开始执行
Thread:pool-1-thread-114开始执行
Thread:pool-1-thread-117开始执行
Thread:pool-1-thread-108开始执行
Thread:pool-1-thread-120开始执行
Thread:pool-1-thread-119开始执行
Thread:pool-1-thread-123开始执行
Thread:pool-1-thread-124开始执行
Thread:pool-1-thread-126开始执行
Thread:pool-1-thread-127开始执行
Thread:pool-1-thread-118开始执行
Thread:pool-1-thread-116开始执行
Thread:pool-1-thread-131开始执行
Thread:pool-1-thread-132开始执行
Thread:pool-1-thread-133开始执行
Thread:pool-1-thread-115开始执行
Thread:pool-1-thread-136开始执行
Thread:pool-1-thread-137开始执行
Thread:pool-1-thread-139开始执行
Thread:pool-1-thread-113开始执行
Thread:pool-1-thread-142开始执行
Thread:pool-1-thread-143开始执行
Thread:pool-1-thread-110开始执行
Thread:pool-1-thread-146开始执行
Thread:pool-1-thread-147开始执行
Thread:pool-1-thread-112开始执行
Thread:pool-1-thread-150开始执行
Thread:pool-1-thread-151开始执行
Thread:pool-1-thread-149开始执行
Thread:pool-1-thread-154开始执行
Thread:pool-1-thread-155开始执行
Thread:pool-1-thread-148开始执行
Thread:pool-1-thread-158开始执行
Thread:pool-1-thread-159开始执行
Thread:pool-1-thread-160开始执行
Thread:pool-1-thread-145开始执行
Thread:pool-1-thread-144开始执行
Thread:pool-1-thread-165开始执行
Thread:pool-1-thread-141开始执行
Thread:pool-1-thread-140开始执行
Thread:pool-1-thread-169开始执行
Thread:pool-1-thread-138开始执行
Thread:pool-1-thread-172开始执行
Thread:pool-1-thread-173开始执行
Thread:pool-1-thread-174开始执行
Thread:pool-1-thread-176开始执行
Thread:pool-1-thread-177开始执行
Thread:pool-1-thread-178开始执行
Thread:pool-1-thread-135开始执行
Thread:pool-1-thread-182开始执行
Thread:pool-1-thread-134开始执行
Thread:pool-1-thread-130开始执行
Thread:pool-1-thread-129开始执行
Thread:pool-1-thread-189开始执行
Thread:pool-1-thread-190开始执行
Thread:pool-1-thread-192开始执行
Thread:pool-1-thread-128开始执行
Thread:pool-1-thread-125开始执行
Thread:pool-1-thread-122开始执行
Thread:pool-1-thread-198开始执行
Thread:pool-1-thread-121开始执行
Thread:pool-1-thread-199开始执行
Thread:pool-1-thread-197开始执行
Thread:pool-1-thread-196开始执行
Thread:pool-1-thread-195开始执行
Thread:pool-1-thread-194开始执行
Thread:pool-1-thread-193开始执行
Thread:pool-1-thread-191开始执行
Thread:pool-1-thread-188开始执行
Thread:pool-1-thread-187开始执行
Thread:pool-1-thread-186开始执行
Thread:pool-1-thread-185开始执行
Thread:pool-1-thread-184开始执行
Thread:pool-1-thread-183开始执行
Thread:pool-1-thread-181开始执行
Thread:pool-1-thread-180开始执行
Thread:pool-1-thread-179开始执行
Thread:pool-1-thread-175开始执行
Thread:pool-1-thread-171开始执行
Thread:pool-1-thread-170开始执行
Thread:pool-1-thread-168开始执行
Thread:pool-1-thread-167开始执行
Thread:pool-1-thread-166开始执行
Thread:pool-1-thread-164开始执行
Thread:pool-1-thread-163开始执行
Thread:pool-1-thread-162开始执行
Thread:pool-1-thread-161开始执行
Thread:pool-1-thread-157开始执行
Thread:pool-1-thread-156开始执行
Thread:pool-1-thread-153开始执行
Thread:pool-1-thread-152开始执行
 

 多线程代码1执行的如图示

 多线程代码2。countDownLatch初始值设为1,只有countDownLatch.countDown();减为0,拦截才会放行

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CurrentChatTest1{
	 
    //定义一个CountDownLatch
    CountDownLatch countDownLatch = new CountDownLatch(1);
    
  public void countDownLatch() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService.submit(createThread());
            System.out.println(1);
        }
        //计数器减一
        countDownLatch.countDown();
    }
 
    //创建线程
    private Thread createThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Thread: "+Thread.currentThread().getName()+", 准备...");
                    countDownLatch.await();
                    //do something
                    System.out.println("Thread: "+Thread.currentThread().getName()+", 开始...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        return thread;
    }
 
    public static void main(String[] args) {
        CurrentChatTest1 currentChatTest = new CurrentChatTest1();
        currentChatTest.countDownLatch();
    }
}

  多线程代码2的输出

1
Thread: pool-1-thread-1, 准备...
1
Thread: pool-1-thread-2, 准备...
1
1
Thread: pool-1-thread-3, 准备...
Thread: pool-1-thread-4, 准备...
1
Thread: pool-1-thread-5, 准备...
1
Thread: pool-1-thread-6, 准备...
1
Thread: pool-1-thread-7, 准备...
1
Thread: pool-1-thread-8, 准备...
1
Thread: pool-1-thread-9, 准备...
1
Thread: pool-1-thread-10, 准备...
Thread: pool-1-thread-10, 开始...
Thread: pool-1-thread-1, 开始...
Thread: pool-1-thread-3, 开始...
Thread: pool-1-thread-2, 开始...
Thread: pool-1-thread-8, 开始...
Thread: pool-1-thread-9, 开始...
Thread: pool-1-thread-7, 开始...
Thread: pool-1-thread-6, 开始...
Thread: pool-1-thread-5, 开始...
Thread: pool-1-thread-4, 开始...
 

  多线程代码2执行如图示

 多线程代码3

get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束则会阻塞线程,直到任务执行完毕

callable多线程future.get()方法能获取到当前线程的执行结果,但是会阻塞当前线程,即当前线程执行结束获取到结果后才会继续执行下一个线程,解决方法:
创建一个List数组存储funture,在所有线程执行以后遍历list用future.get()获取结果。

package 多线程;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
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;

public class ExecutorServiceTest2{
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        List<Future<String>> resultList = new ArrayList<Future<String>>();

        // 创建10个任务并执行
        for (int i = 0; i < 10; i++) {
            // 使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中
            Future<String> future = executorService.submit(new TaskWithResult(i));
            System.out.println(i);
            resultList.add(future);
//            System.out.println(resultList);
            System.out.println(i);
        }
        System.out.println(1);
        executorService.shutdown();

        // 遍历任务的结果
        for (Future<String> fs : resultList) {
            try {
                System.out.println(fs.get()); // 打印各个线程(任务)执行的结果
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                executorService.shutdownNow();
                e.printStackTrace();
                return;
            }
        }
    }
}

class TaskWithResult implements Callable<String> {
    private int id;

    public TaskWithResult(int id) {
        this.id = id;
    }

    /**
     * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。
     *
     * @return
     * @throws Exception
     */
    public String call() throws Exception {
        System.out.println("call()方法被自动调用,干活!!!             " + Thread.currentThread().getName());
        // 下面的判读是模拟一个抛出异常的操作,随机得到一个true
//        if (new Random().nextBoolean())
//            throw new TaskException("Meet error in task." + Thread.currentThread().getName());
//        // 一个模拟耗时的操作
//        for (int i = 999999999; i > 0; i--)
//            ;
        return "call()方法被自动调用,任务的结果是:" + id + "    " + Thread.currentThread().getName();
    }
}

class TaskException extends Exception {
    public TaskException(String message) {
        super(message);
    }
}

0
0
call()方法被自动调用,干活!!!             pool-1-thread-1
1
1
call()方法被自动调用,干活!!!             pool-1-thread-2
2
2
call()方法被自动调用,干活!!!             pool-1-thread-3
3
3
call()方法被自动调用,干活!!!             pool-1-thread-2
call()方法被自动调用,干活!!!             pool-1-thread-3
4
4
5
5
call()方法被自动调用,干活!!!             pool-1-thread-3
call()方法被自动调用,干活!!!             pool-1-thread-2
6
6
7
7
call()方法被自动调用,干活!!!             pool-1-thread-2
call()方法被自动调用,干活!!!             pool-1-thread-3
8
8
9
9
call()方法被自动调用,干活!!!             pool-1-thread-3
call()方法被自动调用,任务的结果是:0    pool-1-thread-1
call()方法被自动调用,任务的结果是:1    pool-1-thread-2
call()方法被自动调用,任务的结果是:2    pool-1-thread-3
call()方法被自动调用,任务的结果是:3    pool-1-thread-2
call()方法被自动调用,任务的结果是:4    pool-1-thread-3
call()方法被自动调用,任务的结果是:5    pool-1-thread-3
call()方法被自动调用,任务的结果是:6    pool-1-thread-2
call()方法被自动调用,任务的结果是:7    pool-1-thread-2
call()方法被自动调用,任务的结果是:8    pool-1-thread-3
call()方法被自动调用,任务的结果是:9    pool-1-thread-3
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值